/*********************************************************************
* All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*   システム名      ：eo顧客基幹システム
*   モジュール名    ：JFUMskmDmenXmlCC
*   ソースファイル名：JFUMskmDmenXmlCC.java
*   作成者          ：富士通
*   日付            ：2012年06月20日
*＜機能概要＞
*   申込断面XMLコモンコンポーネント部品です。
*＜修正履歴＞
*   バージョン  修正日       修正者      修正内容
*   v4.00       2012/06/20   FJ)西川     新規作成
*   v10.00      2014/08/13   FJ)西川    【OM-2014-0002713】フロント、バックヤード申込の競合不具合
*
**********************************************************************/
package com.fujitsu.futurity.bp.custom.common;

import java.util.HashMap;
import java.util.List;

import com.fujitsu.futurity.bp.x21.bpm.db.SessionHandle;
import com.fujitsu.futurity.bp.x21.bpm.exception.RequestParameterException;
import com.fujitsu.futurity.bp.x21.bpm.parameter.IRequestParameterReadWrite;
import com.fujitsu.futurity.bp.x21.values.MessageID;
import com.fujitsu.futurity.common.JSYbpmLog;
import com.fujitsu.futurity.common.x01.sc.SCControlMapKeys;

import eo.common.constant.JFUStrConst;
import eo.common.constant.JPCModelConstant;
import eo.common.util.JCCFrameworkException;

/**
 * 申込断面XMLコモンコンポーネント部品.
 * <br>
 * @author 富士通
 */
public class JFUMskmDmenXmlCC extends JFUBaseCC
{

	/**
	 * 申込断面XML作成処理.<br>
	 *
	 * @param handle セッションハンドル
	 * @param param リクエストパラメータ
	 * @param fixedText サービスメッセージ
	 * @return リクエストパラメータ
	 * @throws Exception Exception
	 */
	@SuppressWarnings("unchecked")
	public IRequestParameterReadWrite createMskmDmenXml(SessionHandle handle, IRequestParameterReadWrite param, String fixedText) throws Exception
	{
		String xmlFilePath = null;	// 申込断面XML定義ファイルパス
		String mskmDmenXml = null;	// 申込断面XML

		// --------------------------------------
		// エラー情報存在チェック
		// --------------------------------------
		if (isExistsErrorInfo(param))
		{
			// 先行処理でエラー情報が設定されている場合は、処理しない
			return param;
		}

		// ユーザデータ取得
		HashMap inMap = (HashMap)param.getData(fixedText);

		// --------------------------------------
		// ユーザデータ存在チェック
		// --------------------------------------
		if ((inMap == null) || (inMap.isEmpty()))
		{
			// 申込断面XMLマップが存在しない場合は、処理しない
			return param;
		}

		// --------------------------------------
		// 初期値設定
		// --------------------------------------
		// リターンコード設定(0:正常終了)
		inMap.put(JFUStrConst.MSKM_DMEN_XMLCC_OUT_RETURN_CODE, String.valueOf(JPCModelConstant.NORMAL_END));
		// 申込内容("":空文字)
		inMap.put(JFUStrConst.MSKM_DMEN_XMLCC_OUT_MSKM_NAIYO, JFUStrConst.EMPTY);

		// IN項目:種別
		String sbt = (String)inMap.get(JFUStrConst.MSKM_DMEN_XMLCC_IN_SBT);

		// --------------------------------------
		// 申込断面XML定義ファイルパス取得
		// --------------------------------------
		int sbtIdx = 0;
		if (JFUStrConst.MSKM_DMEN_SBT_FRONT.equals(sbt))
		{
			// 種別：フロント
			xmlFilePath = JFUBPCommon.getApplicationConst(JFUStrConst.FU_MSKM_DMEN_XMLFILE_PATH);
		}
		else if (JFUStrConst.MSKM_DMEN_SBT_BACKYARD.equals(sbt))
		{
			// 種別：バック
			xmlFilePath = JFUBPCommon.getApplicationConst(JFUStrConst.KK_MSKM_DMEN_XMLFILE_PATH);
			sbtIdx = 1;
		}
		else
		{
			// 種別が取得できない場合、処理終了
			throw new JCCFrameworkException("申込断面XML種別未設定。フロント/バックを判定できないため処理を終了します。");
		}

		try
		{
			// --------------------------------------
			// 申込断面マップXML変換部品呼出
			// --------------------------------------
			mskmDmenXml = JFUMskmDmenMapConvXml.getMskmDmenXml(inMap, xmlFilePath, sbtIdx);

			// 申込断面XML文字列を後続処理のため「申込内容」としてユーザデータ(mskmDmenXmlMap)に保管
			inMap.put(JFUStrConst.MSKM_DMEN_XMLCC_OUT_MSKM_NAIYO, mskmDmenXml);

		}
		catch (JCCFrameworkException fwe)
		{
			// 例外が発生した場合、エラーログ出力
			JSYbpmLog.println(JSYbpmLog.ERROR, this.getClass(), fwe.toString(),
											MessageID.ERR_BUSINESS_ERROR_MSG, new String[] {"申込断面XML変換"}, null);

			// 申込を完了させるため、CCExceptionは発生させない

			// リターンコード設定(4:ワーニング発生)
			inMap.put(JFUStrConst.MSKM_DMEN_XMLCC_OUT_RETURN_CODE, String.valueOf(JPCModelConstant.WARNING));
		}

		return param;
	}

	/**
	 * エラー情報存在チェック
	 * <br>
	 * @param param リクエストパラメータ
	 * @return エラー情報が存在する場合はtrue、それ以外はfalse
	 */
	@SuppressWarnings("unchecked")
	private boolean isExistsErrorInfo(IRequestParameterReadWrite param)
	{
		Object errList = null;

		// エラー情報を取得
		try
		{
			errList = param.getControlMapData(SCControlMapKeys.ERROR_INFO);
		}
		catch (RequestParameterException re)
		{
			// コントロールマップに値が設定されていない場合スローされる例外
			// (エラー情報なし)
			return false;
		}

		// エラー情報なし
		if (errList == null)
		{
			return false;
		}

		if (errList instanceof List)
		{
			return 0 < ((List)errList).size();
		}
		else
		{
			// エラー情報はリストのはずなので、ありえない
			return true;
		}
	}

	/**
	 * チェック処理
	 *
	 * <br>
	 * @param handle セッションハンドル
	 * @param param リクエストパラメータ
	 * @param fixedText サービスメッセージ
	 * @return リクエストパラメータ
	 * @throws Exception
	 */
	@Override
	public HashMap<String, Object> getInvokeCBS(SessionHandle handle, IRequestParameterReadWrite param, String fixedText) throws Exception
	{
		return null;
	}
}
