/*********************************************************************
*	All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*	システム名		：eo顧客基幹システム
*	モジュール名	：JPCejbEntityMainBase
*	ソースファイル名：JPCejbEntityMainBase.java
*	作成者			：富士通
*	日付			：2011年03月01日
*＜機能概要＞
*	概念スキーマ独自処理部品のスーパークラス
*＜修正履歴＞
*	バージョン	修正日		修正者		修正内容
*	v1.00.00	2011/03/01	富士通		新規作成
*   v29.00.00   2017/04/07	FJ)舘山		ANK-3158-00-00_構造化対応
*
**********************************************************************/

package eo.ejb.common;

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.ArrayList;

import com.fujitsu.futurity.common.JCMConstants;
import com.fujitsu.futurity.model.base.CAANMsg;
import com.fujitsu.futurity.model.base.CAANRuntimeException;

/**
 * <p>
 * 概念スキーマ独自処理部品のスーパークラスです。
 * </p>
 * @author 富士通
 */
public abstract class JPCejbEntityMainBase
{

	/** スキーマ定義情報の取得メソッド名 */
	private static final String GET_CONTENTS = "getContents";

	/** 引継ぎ対象外となる項目キー */
	private static final String[] NOT_SUCCEED_KEY = {
			"GENE_ASS_DTM",
			"ADD_DTM",
			"ADD_OPEACNT",
			"UPD_DTM",
			"UPD_OPEACNT",
			"DEL_DTM",
			"DEL_OPEACNT",
	};

// ▼▼▼ ANK-3158-00-00 2017/04/07 ADD START
	/** システム共通項目キーリスト */
	public static final ArrayList<String> SYS_COMMON_KEY_LIST = new ArrayList<String>();
	static
	{
		SYS_COMMON_KEY_LIST.add("ADD_DTM");       // 登録年月日時分秒
		SYS_COMMON_KEY_LIST.add("ADD_OPEACNT");   // 登録オペレータアカウント
		SYS_COMMON_KEY_LIST.add("UPD_DTM");       // 更新年月日時分秒
		SYS_COMMON_KEY_LIST.add("UPD_OPEACNT");   // 更新オペレータアカウント
		SYS_COMMON_KEY_LIST.add("DEL_DTM");       // 削除年月日時分秒
		SYS_COMMON_KEY_LIST.add("DEL_OPEACNT");   // 削除オペレータアカウント
		SYS_COMMON_KEY_LIST.add("MK_FLG");        // 無効フラグ
		SYS_COMMON_KEY_LIST.add("ADD_UNYO_YMD");  // 登録運用年月日
		SYS_COMMON_KEY_LIST.add("ADD_TRN_ID");    // 登録処理ID
		SYS_COMMON_KEY_LIST.add("UPD_UNYO_YMD");  // 更新運用年月日
		SYS_COMMON_KEY_LIST.add("UPD_TRN_ID");    // 更新処理ID
		SYS_COMMON_KEY_LIST.add("DEL_UNYO_YMD");  // 削除運用年月日
		SYS_COMMON_KEY_LIST.add("DEL_TRN_ID");    // 削除処理ID
	};
// ▲▲▲ ANK-3158-00-00 2017/04/07 ADD END

	/**
	 * <p>
	 * 新しいJPCejbEntityMainBaseを作成します。
	 * </p>
	 */
	public JPCejbEntityMainBase()
	{
	}

	/**
	 * <p>
	 * カレントデータ引継ぎを行います。
	 * </p>
	 * @param inCBMMsg 処理対象のメッセージキャリア
	 * @param inETMsg カレントデータが格納されたメッセージキャリア
	 */
	protected void succeedMsgData(CAANMsg inCBMMsg, CAANMsg inETMsg)
	{
		// スキーマ定義情報の取得
		Object[][] contents = getSchemaContents(inETMsg.getSchemaName());

		for (int i = 0; i < contents.length; i++)
		{
			String key = (String)contents[i][0];

			// 引継ぎ対象外項目キーの場合
			if (!isSucceedMsgData(key))
			{
				continue;
			}

			// CBMMsgにデータが設定されている場合
			if (inCBMMsg.containsKeyOfMsgData(key))
			{
				continue;
			}

			// ETMsgにデータが設定されていない場合
			if (!inETMsg.containsKeyOfMsgData(key))
			{
				continue;
			}

			// カレントデータを引継ぎ
			inCBMMsg.set(key, inETMsg.getObject(key));
		}
	}

	/**
	 * <p>
	 * データ引継ぎの処理対象イベントか判定します。
	 * </p>
	 * @param inCBMMsg 処理対象のCBMMsg
	 * @return データ引継ぎの処理対象イベントの場合はtrue
	 */
	protected boolean isSucceedEvent(CAANMsg inCBMMsg)
	{
		String templateID = inCBMMsg.getString(JCMConstants.TEMPLATE_ID_KEY);
		String eventID = inCBMMsg.getString(JCMConstants.EVENT_ID_KEY);

		if (templateID.charAt(7) != 'C')
		{
			return false;
		}

		if (eventID.charAt(6) != 'D')
		{
			return false;
		}

		return true;
	}

	/**
	 * <p>
	 * 引継ぎ項目キーが引継ぎ対象か判定を行います。
	 * </p>
	 * @param key 引継ぎ項目キー
	 * @return 引継ぎ対象の場合はtrue
	 */
	private boolean isSucceedMsgData(String key)
	{
		for (int i = 0; i < NOT_SUCCEED_KEY.length; i++)
		{
			if (NOT_SUCCEED_KEY[i].equals(key))
			{
				return false;
			}
		}

		return true;
	}

	/**
	 * <p>
	 * スキーマの定義情報を取得します。
	 * </p>
	 * @param schemaName 定義情報を取得するスキーマ名
	 */
	private Object[][] getSchemaContents(String schemaName)
	{
		try
		{
			Class<?> cls = Class.forName(schemaName);
			Object instance = cls.newInstance();
			Method method = cls.getMethod(GET_CONTENTS, (Class<?>[])null);
			return (Object[][])method.invoke(instance, (Object[])null);
		}
		catch (Exception e)
		{
			throw new CAANRuntimeException(e);
		}
	}
}
