/*********************************************************************
* All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*   システム名      ：eo顧客基幹システム
*   モジュール名    ：JFUMskmDmenMapConvXml
*   ソースファイル名：JFUMskmDmenMapConvXml.java
*   作成者          ：富士通
*   日付            ：2012年06月20日
*＜機能概要＞
*   申込断面マップXML変換部品です。
*＜修正履歴＞
*   バージョン  修正日       修正者      修正内容
*   v4.00       2012/06/20   FJ)西川     新規作成
*   v9.00       2014/08/13   FJ)西川    【OM-2014-0002713】フロント、バックヤード申込の競合不具合
*   v9.00       2014/08/14   FJ)中谷    【OM-2014-0002698】戻るボタン押下時の申込断面の登録内容
*   
**********************************************************************/
package com.fujitsu.futurity.bp.custom.common;

import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;

import javax.xml.parsers.ParserConfigurationException;

import org.xml.sax.SAXException;

import com.fujitsu.futurity.common.JSYbpmLog;

import eo.common.constant.JFUStrConst;
import eo.common.util.JCCFrameworkException;
import eo.common.util.JCCMapConvXml;
import eo.common.util.JFUMskmDmenXmlCache;

/**
 * 申込断面マップXML変換部品.
 * <br>
 * @author 富士通
 */
@SuppressWarnings("unchecked")
public class JFUMskmDmenMapConvXml
{
	/** index属性取得キー */
	private static final String KEY_INDEX = "index";

	/** cnt属性取得キー */
	private static final String KEY_CNT = "cnt";

	/** cnt属性：アスタリスク(可変) */
	private static final String CNT_ATTR_ASTERISK = "*";

	/** コメント要素開始文字列 */
	private static final String COMMENT_START_STR = "<!--";

	/** 本クラス名 */
	private static final String MY_CLASS_NAME = "com.fujitsu.futurity.bp.custom.common.JFUMskmDmenMapConvXml";

	/** コピー用ROOT要素のタグ名 */
	private static final String COPY_ROOT_ELEMENT = "COPY_ROOT_ELEMENT";

	/** マップキー:WEB新規情報 */
	private static final String KEY_WEB_NEW_INFO = "web_new_info";
	/** マップキー:契約サービス情報 */
	private static final String KEY_KEIYAKU_SVC_INFO = "keiyaku_svc_info";
	/** マップキー:選択(ネット) */
	private static final String KEY_SELECT_SVC_NET = "select_svc_net";
	/** マップキー:選択(電話) */
	private static final String KEY_SELECT_SVC_TEL = "select_svc_tel";
	/** マップキー:選択(TV) */
	private static final String KEY_SELECT_SVC_TV = "select_svc_tv";
	/** マップキー:選択(モバイル) */
	private static final String KEY_SELECT_SVC_MOBILE = "select_svc_mobile";
	/** マップキー:ネット */
	private static final String KEY_EONET = "eonet";
	/** マップキー:電話 */
	private static final String KEY_EOTEL = "eotel";
	/** マップキー:TV */
	private static final String KEY_EOTV = "eotv";
	/** マップキー:モバイル */
	private static final String KEY_EOMOBILE = "eomobile";

	/**
	 * 申込断面マップXML変換処理.
	 * <br>
	 * @param mskmDmenMap	申込断面マップ
	 * @param xmlFilePath	出力テンプレートXMLファイルパス
	 * @param sbtIdx	申込断面XML種別番号（0:フロント、1:バックヤード）
	 * @return 申込断面マップXML文字列
	 * @throws JCCFrameworkException	すべての例外
	 */
	public static String getMskmDmenXml(HashMap<String, Object> mskmDmenMap, String xmlFilePath, int sbtIdx) throws JCCFrameworkException
	{
		String strMskmDmenXml = null;
		HashMap<String, Object> outXmlMap = null;

		//----------------------------------
		// 入力パラメータチェック
		//----------------------------------
		checkInputpParameter(mskmDmenMap, xmlFilePath);

		// フロントの場合
		if (JFUStrConst.I_ZERO == sbtIdx)
		{
			// 不要な情報の削除処理 
			deleteInfo(mskmDmenMap);
		}

		try
		{
			// MAPオブジェクトXMLデータ変換部品インスタンス取得
			JCCMapConvXml converter = new JCCMapConvXml();
			//----------------------------------
			// テンプレートXML⇒Map変換
			//----------------------------------
			outXmlMap = converter.getParseXmlToMap(getFileString(xmlFilePath, sbtIdx));

			//----------------------------------
			// 申込断面Map(XML)の編集
			//----------------------------------
			editMskmDmenXmlMap(mskmDmenMap, outXmlMap, (ArrayList<Object>)outXmlMap.get(JCCMapConvXml.KEY_VALUE));

			//----------------------------------
			// 申込断面Map⇒XML変換
			//----------------------------------
			strMskmDmenXml = converter.getParseMapToXml(outXmlMap);
			printlnDebug("★作成したXMLのgetParseMapToXml結果★" + converter.getParseXmlToMap(strMskmDmenXml));
		}
		catch (Throwable th)
		{
			throw makeJCCFrameworkException(th);
		}

		return strMskmDmenXml;
	}

	/**
	 * 不要な情報の削除処理
	 * <br>
	 * 
	 * @param mskmDmenMap 申込断面マップ
	 */
	private static void deleteInfo(HashMap mskmDmenMap)
	{
		// WEB新規情報
		HashMap webNewInfoMap = (HashMap)mskmDmenMap.get(KEY_WEB_NEW_INFO);

		if (null == webNewInfoMap)
		{
			return;
		}

		// 契約サービス情報リスト
		ArrayList svcInfoList = (ArrayList)webNewInfoMap.get(KEY_KEIYAKU_SVC_INFO);

		if (null == svcInfoList || svcInfoList.isEmpty())
		{
			return;
		}

		// 契約サービス情報
		HashMap svcInfoMap = (HashMap)svcInfoList.get(0);

		// 削除候補リスト
		List<String> delList = new ArrayList();

		// ネット
		if (JFUStrConst.CD00002_0.equals(svcInfoMap.get(KEY_SELECT_SVC_NET)))
		{
			delList.add(KEY_EONET);
		}

		// 電話
		if (JFUStrConst.CD00002_0.equals(svcInfoMap.get(KEY_SELECT_SVC_TEL)))
		{
			delList.add(KEY_EOTEL);
		}

		// TV
		if (JFUStrConst.CD00002_0.equals(svcInfoMap.get(KEY_SELECT_SVC_TV)))
		{
			delList.add(KEY_EOTV);
		}

		// モバイル
		if (JFUStrConst.CD00002_0.equals(svcInfoMap.get(KEY_SELECT_SVC_MOBILE)))
		{
			delList.add(KEY_EOMOBILE);
		}

		// 空リスト
		List<HashMap> emptyList = new ArrayList<HashMap>();

		emptyList.add(new HashMap());

		for (String key : delList)
		{
			if (null != webNewInfoMap.get(key))
			{
				webNewInfoMap.put(key, emptyList);
			}
		}
	}

	/**
	 * 申込断面Map(XML)の編集処理
	 * <br>
	 * @param mskmDmenMap				申込断面マップ(データ取得元)
	 * @param outXmlMap					テンプレートXMLマップ(出力XML雛形)
	 * @param parentValueList			親階層のVALUEリスト(出力XML雛形：可変要素追加用)
	 * @throws JCCFrameworkException	すべての例外
	 * @throws ClassNotFoundException	Debugログ出力でClass.forNameが失敗した場合(自クラスを指定しているためありえない)
	 * @throws SAXException XMLマップコピー処理にて、XML←→Map変換時に共通部品で発生する例外(部品を使ってXML化したMapの変換処理なのでありえない)
	 * @throws ParserConfigurationException XMLマップコピー処理にて、XML←→Map変換時に共通部品で発生する例外
	 * @throws IOException  XMLマップコピー処理にて、XML←→Map変換時に共通部品で発生する例外(部品を使ってXML化したMapの変換処理なのでありえない)
	 */
	private static void editMskmDmenXmlMap(HashMap<String, Object> mskmDmenMap, HashMap<String, Object> outXmlMap, ArrayList<Object> parentValueList)
			throws JCCFrameworkException, ClassNotFoundException, SAXException, ParserConfigurationException, IOException
	{
		//		printlnDebug("----- [editMskmDmenXmlMap] start -----");
		//		printlnDebug("【申込断面マップ】" + mskmDmenMap);
		//		printlnDebug("【テンプレートXMLマップ】" + outXmlMap);

		int indexAttr = 0; // index属性
		String cntAttr = null; // cnt属性

		// 申込断面データMap
		HashMap<String, Object> dataMap = null;
		// VALUEリスト(テンプレートXML)
		ArrayList<Object> valueList = null;

		//----------------------------------
		// データ存在チェック
		//----------------------------------
		// 申込断面マップが未設定の場合
		if ((mskmDmenMap == null) || (mskmDmenMap.isEmpty()))
		{
			//			printlnDebug("----- [editMskmDmenXmlMap] end -----");
			// 以降の要素は出力値が存在しないため、処理終了
			return;
		}

		//----------------------------------
		// データ取得元マップ初期設定
		//----------------------------------
		// デフォルト：dataMapに申込断面マップを指定
		dataMap = mskmDmenMap;

		// テンプレートXMLマップを処理
		//----------------------------------
		// ELEMENT取得
		//----------------------------------
		String element = (String)outXmlMap.get(JCCMapConvXml.KEY_ELEMENT);

		// コメント文の場合は属性、値はないので処理終了
		if (element.startsWith(COMMENT_START_STR))
		{
			//			printlnDebug("----- [editMskmDmenXmlMap] end -----");
			return;
		}

		//----------------------------------
		// ENCODING取得
		//----------------------------------
		// ENCODINGが存在する場合、最上位マップのため、VALUEのみ処理
		if (!outXmlMap.containsKey(JCCMapConvXml.KEY_ENCODING))
		{
			//----------------------------------
			// ATTRIBUTE/VALUEが存在しない場合
			//----------------------------------
			if ((!outXmlMap.containsKey(JCCMapConvXml.KEY_ATTRIBUTE)) && (!outXmlMap.containsKey(JCCMapConvXml.KEY_VALUE)))
			{
				// 最下層データ⇒elementをキーにユーザデータから値を取得してVALUEに格納
				putValue(outXmlMap, dataMap, element);
				// 処理終了
				return;
			}

			//----------------------------------
			// ATTRIBUTE取得
			//----------------------------------
			if (outXmlMap.containsKey(JCCMapConvXml.KEY_ATTRIBUTE))
			{
				// index属性取得
				indexAttr = getIntAttr((ArrayList<HashMap<String, String>>)outXmlMap.get(JCCMapConvXml.KEY_ATTRIBUTE), KEY_INDEX);
				// cnt属性取得
				cntAttr = getStrAttr((ArrayList<HashMap<String, String>>)outXmlMap.get(JCCMapConvXml.KEY_ATTRIBUTE), KEY_CNT);

				//----------------------------------
				// 属性整合性チェック
				//----------------------------------
				chkAttr(indexAttr, cntAttr, element);

				//----------------------------------
				// 可変要素処理
				//----------------------------------
				if (CNT_ATTR_ASTERISK.equals(cntAttr))
				{
					editRepeatElement(mskmDmenMap, element, parentValueList, outXmlMap);
				}

				//----------------------------------
				// 値格納マップを取得
				//----------------------------------
				dataMap = getDataMap(mskmDmenMap, element, indexAttr);
			}
		}

		//----------------------------------
		// VALUEが存在しない場合
		//----------------------------------
		// (配列要素の最下層データ。可変要素処理を行ってから処理する)
		if (!outXmlMap.containsKey(JCCMapConvXml.KEY_VALUE))
		{
			// 最下層データ⇒elementをキーにユーザデータから値を取得してVALUEに格納
			putValue(outXmlMap, dataMap, element);
			// 処理終了
			return;
		}

		//----------------------------------
		// VALUE取得
		//----------------------------------
		if (outXmlMap.containsKey(JCCMapConvXml.KEY_VALUE))
		{
			// VALUEリスト処理を実行
			valueList = (ArrayList<Object>)outXmlMap.get(JCCMapConvXml.KEY_VALUE);
			for (int i = 0; i < valueList.size(); i++)
			{
				Object valObj = valueList.get(i);

				// 子要素の場合
				if (valObj instanceof HashMap)
				{
					// 子要素のHashMapを編集
					editMskmDmenXmlMap(dataMap, (HashMap<String, Object>)valObj, valueList);
				}
				// 値の場合
				else if (valObj instanceof String)
				{
					// テンプレートに値が設定されている(不正な定義)
					printlnDebug("テンプレートXMLに値が設定されています。【要素】" + element);
					// テンプレートXMLマップから削除
					valueList.remove(valObj);
					// 最下層データ⇒elementをキーにユーザデータから値を取得してVALUEに格納
					putValue(outXmlMap, dataMap, element);
				}

			}
		}
		//		printlnDebug("----- [editMskmDmenXmlMap] end -----");
	}

	/**
	 * 値格納マップ取得
	 * <br>
	 * @param mskmDmenMap	申込断面マップ(データ取得元)
	 * @param element		テンプレートXMLマップのELEMENT
	 * @param indexAttr		テンプレートXMLで指定されたindex属性
	 * @return 申込断面マップから取得したelementに該当する値格納マップ
	 */
	private static HashMap<String, Object> getDataMap(HashMap<String, Object> mskmDmenMap, String element, int indexAttr)
	{
		// 申込断面データMap
		HashMap<String, Object> dataMap = null;

		try
		{
			//----------------------------------
			// データ存在チェック
			//----------------------------------
			// elementをキーに申込断面マップから情報が取得できない場合
			if (mskmDmenMap.get(element) == null)
			{
				// 出力すべき値が存在しないため、処理終了
				return null;
			}

			//----------------------------------
			// 値格納マップを取得
			//----------------------------------
			Object objData = mskmDmenMap.get(element);
			if (objData instanceof HashMap)
			{
				// elementをキーに値格納Mapを取得
				dataMap = (HashMap<String, Object>)objData;
			}
			else if (objData instanceof ArrayList)
			{
				// 子リストが存在する場合
				if (((ArrayList)objData).size() > indexAttr)
				{
					// 指定indexのリスト要素から値格納Mapを取得
					dataMap = (HashMap<String, Object>)((ArrayList)objData).get(indexAttr);
				}
			}
		}
		catch (Exception e)
		{
			// あらゆる例外をcatch(データなしとして処理する)
			return null;
		}

		return dataMap;
	}

	/**
	 * VALUE格納
	 * <br>
	 * @param outXmlMap		テンプレートXMLマップ
	 * @param mskmDmenMap	申込断面マップ(データ取得元)
	 * @param element		要素名(取得キー)
	 */
	private static void putValue(HashMap<String, Object> outXmlMap, HashMap<String, Object> mskmDmenMap, String element)
	{
		// 申込断面マップにelementが含まれない場合、処理しない
		if (mskmDmenMap.containsKey(element))
		{
			Object objData = mskmDmenMap.get(element);
			if (!JFUBPCommon.isNull(objData))
			{
				// String/Long/Booleanの場合のみ取得(その他の場合は正しい格納値ではない)
				if ((objData instanceof String) || (objData instanceof Long) || (objData instanceof Boolean))
				{
					// テンプレートXMLマップのVALUEに格納
					ArrayList<Object> valList = new ArrayList<Object>();
					valList.add(String.valueOf(objData));
					outXmlMap.put(JCCMapConvXml.KEY_VALUE, valList);
				}
			}
		}
	}

	/**
	 * 属性整合性チェック
	 * <br>
	 * @param indexAttr		index属性値
	 * @param cntAttr		cnt属性値
	 * @param element		要素値
	 * @throws JCCFrameworkException	テンプレートXMLの属性が不正な場合
	 */
	private static void chkAttr(int indexAttr, String cntAttr, String element) throws JCCFrameworkException
	{
		if ((0 > indexAttr) && (cntAttr == null))
		{
			// indexもcntも指定がない場合
			throw new JCCFrameworkException("テンプレートXMLの定義が不正です(属性indexとcntが未指定)【要素】" + element);
		}
		// index属性が取得できない場合
		else if (0 > indexAttr)
		{
			throw new JCCFrameworkException("テンプレートXMLの定義が不正です(属性indexが未指定)【要素】" + element);
		}
		else if (cntAttr == null)
		{
			throw new JCCFrameworkException("テンプレートXMLの定義が不正です(属性cntが未指定)【要素】" + element);
		}
	}

	/**
	 * 属性値設定
	 * <br>
	 * @param attrList		テンプレートXMLマップより取得したATTRIBUTEリスト
	 * @param key			属性キー
	 * @param val			設定値
	 */
	private static void setAttr(ArrayList<HashMap<String, String>> attrList, String key, String val)
	{
		HashMap<String, String> attrMap = null;
		for (int i = 0; i < attrList.size(); i++)
		{
			attrMap = attrList.get(i);
			if (attrMap.containsKey(key))
			{
				attrMap.put(key, val);
				break;
			}
		}
	}

	/**
	 * String属性値取得
	 * <br>
	 * @param attrList		テンプレートXMLマップより取得したATTRIBUTEリスト
	 * @param key			属性取得キー
	 * @return 属性値 (属性が存在しない場合、null)
	 */
	private static String getStrAttr(ArrayList<HashMap<String, String>> attrList, String key)
	{
		String attrVal = null;
		HashMap<String, String> attrMap = null;

		for (int i = 0; i < attrList.size(); i++)
		{
			attrMap = attrList.get(i);
			if (attrMap.containsKey(key))
			{
				attrVal = (String)attrMap.get(key);
				break;
			}
		}
		return attrVal;
	}

	/**
	 * int属性値取得
	 * <br>
	 * @param attrList		テンプレートXMLマップより取得したATTRIBUTEリスト
	 * @param key			属性取得キー
	 * @return 属性値(int) 属性が存在しない場合、または、数値でない場合は-1
	 */
	private static int getIntAttr(ArrayList<HashMap<String, String>> attrList, String key)
	{
		int attrVal = -1;
		HashMap<String, String> attrMap = null;

		for (int i = 0; i < attrList.size(); i++)
		{
			attrMap = attrList.get(i);
			if (attrMap.containsKey(key))
			{
				attrVal = getAttrVal(attrMap, key);
				break;
			}
		}

		return attrVal;
	}

	/**
	 * int値取得
	 * <br>
	 * @param attrMap	ATTRIBUTEマップ
	 * @param key		属性取得キー
	 * @return ATTRIBUTEマップから取得したint値(属性が存在しない場合、または、数値でない場合は-1)
	 * @throws NumberFormatException 属性に記載された文字列が構文解析可能な整数型を含まない場合
	 */
	private static int getAttrVal(HashMap<String, String> attrMap, String key) throws NumberFormatException
	{
		return Integer.parseInt(attrMap.get(key));
	}

	/**
	 * 入力パラメータチェック処理.
	 * <br>
	 * @param mskmDmenMap 申込断面Mapオブジェクト
	 * @param xmlFilePath 出力テンプレートXMLファイルパス
	 * @throws JCCFrameworkException	引数が不正な場合
	 */
	private static void checkInputpParameter(HashMap<String, Object> mskmDmenMap, String xmlFilePath) throws JCCFrameworkException
	{
		if (null == mskmDmenMap)
		{
			throw new JCCFrameworkException("申込断面Mapオブジェクトが設定されていません。");
		}

		if (JFUBPCommon.isNull(xmlFilePath))
		{
			throw new JCCFrameworkException("出力テンプレートXMLファイルパスが設定されていません。");
		}
	}

	/**
	 * 可変要素処理
	 * <br>
	 * @param mskmDmenMap		申込断面マップ(データ取得元)
	 * @param element			テンプレートXMLマップのELEMENT
	 * @param parentValueList	親階層のVALUEリスト(出力XML雛形：可変要素追加用)
	 * @param repeatXmlMap		可変要素のテンプレートXMLマップ
	 * @return 処理結果(true:繰り返し出力あり/false:繰り返し出力なし)
	 * @throws JCCFrameworkException XMLマップコピー処理にて、XML←→Map変換時に共通部品で発生する例外
	 * @throws SAXException XMLマップコピー処理にて、XML←→Map変換時に共通部品で発生する例外(部品を使ってXML化したMapの変換処理なのでありえない)
	 * @throws ParserConfigurationException XMLマップコピー処理にて、XML←→Map変換時に共通部品で発生する例外
	 * @throws IOException  XMLマップコピー処理にて、XML←→Map変換時に共通部品で発生する例外(部品を使ってXML化したMapの変換処理なのでありえない)
	 */
	private static void editRepeatElement(HashMap<String, Object> mskmDmenMap, String element, ArrayList<Object> parentValueList,
			HashMap<String, Object> repeatXmlMap) throws SAXException, ParserConfigurationException, IOException
	{
		// テンプレートXMLに定義された可変要素が、申込断面マップに出現する数を取得
		int dataMapCnt = getDataMapCnt(mskmDmenMap, element);

		// 0:申込断面マップに存在しない場合(出力すべきデータなし)
		// 1:データが1件の場合(繰り返し処理は不要)
		if (dataMapCnt <= 1)
		{
			//----------------------------------
			// cnt属性編集
			//     cnt="*"  ⇒ cnt="1"
			//----------------------------------
			// (要素が存在しない場合も、テンプレートXMLに記載されたタグのみ出力するため要素数は1)
			setAttr((ArrayList<HashMap<String, String>>)repeatXmlMap.get(JCCMapConvXml.KEY_ATTRIBUTE), KEY_CNT, String.valueOf(1));
		}
		else
		{
			//----------------------------------
			// cnt属性編集
			//----------------------------------
			// 申込断面マップデータ件数に応じてcnt属性を編集
			setAttr((ArrayList<HashMap<String, String>>)repeatXmlMap.get(JCCMapConvXml.KEY_ATTRIBUTE), KEY_CNT, String.valueOf(dataMapCnt));
			//----------------------------------
			// index属性編集
			//----------------------------------
			// 念のためindex属性に、先頭0を再設定
			setAttr((ArrayList<HashMap<String, String>>)repeatXmlMap.get(JCCMapConvXml.KEY_ATTRIBUTE), KEY_INDEX, String.valueOf(0));

			//----------------------------------
			// 親階層のVALUEリスト編集
			//----------------------------------
			// 親階層のVALUEリストでの出現位置を取得
			int curIndex = parentValueList.indexOf(repeatXmlMap);

			// データ出現数分、親VALUEリストにXMLマップを追加
			for (int i = 1; i < dataMapCnt; i++)
			{
				// 可変要素のXMLマップコピー(DeepCopy)を取得
				HashMap<String, Object> copyMap = getCopyXmlMap(repeatXmlMap);
				// index属性編集
				setAttr((ArrayList<HashMap<String, String>>)copyMap.get(JCCMapConvXml.KEY_ATTRIBUTE), KEY_INDEX, String.valueOf(i));
				// 親階層のVALUEリストに追加
				parentValueList.add(curIndex + 1, copyMap);

				curIndex = curIndex + 1;
			}
		}
	}

	/**
	 * 値格納マップ数取得
	 * <br>
	 * @param mskmDmenMap	申込断面マップ(データ取得元)
	 * @param element		テンプレートXMLマップのELEMENT
	 * @return 申込断面マップから取得したelementに該当する値格納マップ
	 */
	private static int getDataMapCnt(HashMap<String, Object> mskmDmenMap, String element)
	{
		// 申込断面データMap数
		int dataMapCnt = 0;

		try
		{
			//----------------------------------
			// データ存在チェック
			//----------------------------------
			// elementをキーに申込断面マップから情報が取得できない場合
			if (!(mskmDmenMap.get(element) == null))
			{
				//----------------------------------
				// 値格納マップを取得
				//----------------------------------
				Object objData = mskmDmenMap.get(element);
				if (objData instanceof HashMap)
				{
					// 直下に値格納Mapが存在する場合、1要素のみ
					dataMapCnt = 1;
				}
				else if (objData instanceof ArrayList)
				{
					// 子リストが存在する場合、子リストの数
					dataMapCnt = ((ArrayList)objData).size();
				}
			}
		}
		catch (Exception e)
		{
			// あらゆる例外をcatch(データなしとして処理する)
			return 0;
		}

		return dataMapCnt;
	}

	/**
	 * XMLマップコピー処理
	 * <br>
	 * @param outXmlMap コピー対象のテンプレートXMLマップ
	 * @return 対象と同構造のXMLマップ(部品で変換することでDeepCopy)
	 * @throws SAXException XMLマップコピー処理にて、XML←→Map変換時に共通部品で発生する例外(部品を使ってXML化したMapの変換処理なのでありえない)
	 * @throws ParserConfigurationException XMLマップコピー処理にて、XML←→Map変換時に共通部品で発生する例外
	 * @throws IOException  XMLマップコピー処理にて、XML←→Map変換時に共通部品で発生する例外(部品を使ってXML化したMapの変換処理なのでありえない)
	 */
	private static HashMap<String, Object> getCopyXmlMap(HashMap<String, Object> outXmlMap) throws SAXException, ParserConfigurationException,
			IOException
	{
		HashMap<String, Object> copyMap = null;
		String strXml = null;

		// MAPオブジェクトXMLデータ変換部品インスタンス取得
		JCCMapConvXml converter = new JCCMapConvXml();

		//----------------------------------
		// XML変換用ROOTマップ作成
		//----------------------------------
		HashMap<String, Object> rootMap = new HashMap<String, Object>();
		// VALUEにCopy対象のMapを格納
		ArrayList<Object> rootValList = new ArrayList<Object>();
		rootValList.add(outXmlMap);

		rootMap.put(JCCMapConvXml.KEY_ENCODING, JFUMskmDmenXmlCache.MSKM_DMEN_XML_ENCODING); // ENCODING
		rootMap.put(JCCMapConvXml.KEY_ELEMENT, COPY_ROOT_ELEMENT); // ELEMENT
		rootMap.put(JCCMapConvXml.KEY_VALUE, rootValList); // VALUE

		//----------------------------------
		// 変換部品を介して同構造のMapを取得
		//----------------------------------
		// ROOTマップ⇒XML変換
		strXml = converter.getParseMapToXml(rootMap);
		// ROOTXML⇒Map変換
		rootMap = converter.getParseXmlToMap(strXml);

		// 同構造のMapをROOTマップ(部品が作ったオブジェクトに参照は変更されている)から取得
		copyMap = (HashMap<String, Object>)((ArrayList)rootMap.get(JCCMapConvXml.KEY_VALUE)).get(0);

		return copyMap;
	}

	/**
	 * ファイル内容取得処理.
	 * <br>
	 * @param xmlFilePath 出力テンプレートXMLファイルパス
	 * @param sbtIdx	申込断面XML種別番号（0:フロント、1:バックヤード）
	 * @return 出力テンプレートXMLファイル内容
	 * @throws Exception	すべての例外
	 */
	private static String getFileString(String xmlFilePath, int sbtIdx) throws Exception
	{
		// 申込断面XMLファイルキャッシュ部品からファイル内容を取得
		JFUMskmDmenXmlCache.setPath(xmlFilePath, sbtIdx);
		return JFUMskmDmenXmlCache.getFileString(sbtIdx);
	}

	/**
	 * JCCFrameworkExceptionオブジェクト生成処理です。
	 * ThrowableオブジェクトをJCCFrameworkExceptionオブジェクトに保持して返却します。
	 * ThrowableオブジェクトがJCCFrameworkExceptionオブジェクトの場合は、そのまま返却します。
	 * @param th Throwableオブジェクト
	 * @return JCCFrameworkExceptionオブジェクト
	 */
	private static JCCFrameworkException makeJCCFrameworkException(Throwable th)
	{
		JCCFrameworkException fwe = null;
		if (th instanceof JCCFrameworkException)
		{
			return (JCCFrameworkException)th;
		}
		if (th instanceof Exception)
		{
			fwe = new JCCFrameworkException((Exception)th);
		}
		else
		{
			fwe = new JCCFrameworkException();
		}
		fwe.initCause(th);
		return fwe;
	}

	/**
	 * デバッグログを出力します。
	 * <br>
	 * @param dumpObj 出力するオブジェクト
	 * @throws ClassNotFoundException Class.forNameが失敗した場合(自クラスを指定しているためありえない)
	 */
	private static void printlnDebug(Object dumpObj) throws ClassNotFoundException
	{
		JSYbpmLog.println(JSYbpmLog.DEBUG, Class.forName(MY_CLASS_NAME), dumpObj, null, null, null);
	}
}
