/*********************************************************************
*   All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*   システム名      ：eo顧客基幹システム
*   モジュール名    ：JZMejbZM0171DELCRCK
*   ソースファイル名：JZMejbZM0171DELCRCK.java
*   作成者          ：富士通
*   日付            ：2011年05月20日
*＜機能概要＞
*   コード名称管理の削除時の制約を行う部品
*＜修正履歴＞
*   バージョン  修正日      修正者      修正内容
*	v1.00		2011/05/20   FJ) 木田	新規作成
*
**********************************************************************/

package eo.ejb.common.entity;

import java.lang.reflect.Method;

import com.fujitsu.futurity.model.base.CAANFinderException;
import com.fujitsu.futurity.model.base.CAANMsg;
import com.fujitsu.futurity.model.base.CAANRuntimeException;
import com.fujitsu.futurity.model.ejb.common.fw.AgentDispatchContext;
import com.fujitsu.futurity.model.ejb.common.fw.TemplateSQLEntity;

/**
 * コード名称管理の削除時の制約を行う部品クラスです。<p>
 * <BR>
 * @author 富士通
 */
public class JZMejbZM0171DELCRCK extends TemplateSQLEntity
{

	/** スキーマ名 */
	private String schemaName = null;

	/** スキーマ定義情報 */
	private Object[][] contents = null;

	/** テーブル名 */
	private String tableName = null;

	/** スキーマ定義情報の取得メソッド名 */
	private static final String GET_CONTENTS = "getContents";

	/** スキーマテーブル名の取得メソッド名 */
	private static final String GET_TABLE = "getTableName";

	/** 更新年月日時分秒項目名(英名) */
	private static final String UPD_DTM = "UPD_DTM";

	/**
	 * 新しいJZMejbZM0171DELCRCKを作成します。
	 * <br>
	 * @param arg0 スキーマ名
	 */
	public JZMejbZM0171DELCRCK(String arg0)
	{
		super();
		setSchemaInfo(arg0);
	}

	/**
	 * スキーマ名を取得します。
	 * <br>
	 * @return スキーマ名
	 */
	protected String getSchemaName()
	{
		return this.schemaName;
	}

	/**
	 * スキーマの定義情報を取得します。
	 * <br>
	 * @return スキーマの定義情報
	 */
	protected Object[][] getSchemaContents()
	{
		return this.contents;
	}

	/**
	 * スキーマのテーブル名を取得します。
	 * <br>
	 * @return スキーマのテーブル名
	 */
	protected String getTableName()
	{
		return this.tableName;
	}

	/**
	 * スキーマ情報を設定します。
	 * パラメータのスキーマ名から対象スキーマの定義情報、テーブル名を設定します。
	 * <br>
	 * @param arg0 スキーマ名
	 */
	private void setSchemaInfo(String arg0)
	{
		this.schemaName = arg0;
		setSchemaContents();
		setTableName();
	}

	/**
	 * スキーマの定義情報を設定します。
	 * <br>
	 */
	private void setSchemaContents()
	{
		try
		{
			Class<?> cls = Class.forName(this.schemaName);
			Object instance = cls.newInstance();
			Method method = cls.getMethod(GET_CONTENTS, (Class<?>[])null);
			this.contents = (Object[][])method.invoke(instance, (Object[])null);
		}
		catch (Exception e)
		{
			throw new CAANRuntimeException(e);
		}
	}

	/**
	 * スキーマのテーブル名を設定します。
	 * <br>
	 */
	private void setTableName()
	{
		try
		{
			Class<?> cls = Class.forName(this.schemaName);
			Object instance = cls.newInstance();
			Method method = cls.getMethod(GET_TABLE, (Class<?>[])null);
			this.tableName = (String)method.invoke(instance, (Object[])null);
		}
		catch (Exception e)
		{
			throw new CAANRuntimeException(e);
		}
	}

	/**
	 * タイムスタンプチェックを行います。
	 * <br>
	 * @param inMsg 処理対象のメッセージキャリア
	 * @param schemaID スキーマID
	 * @return データが存在する場合はtrue、存在しない場合はfalse
	 */
	private boolean isNotUpdated(CAANMsg inMsg, String schemaID)
	{
		
		if (null == inMsg)
		{
			throw new IllegalArgumentException("inMsgの値が不正です。");
		}
		
		try
		{
			CAANMsg outMsg = findByPrimaryKey(inMsg);
			
			if (Long.parseLong(inMsg.getString(UPD_DTM)) < Long.parseLong(outMsg.getString(UPD_DTM)))
			{
				return false;
			}
		}
		catch (CAANFinderException cfe)
		{
			// レコードが存在しない場合
			return false;
		}

		return true;
	}

	/**
	 * 排他モードタイムスタンプチェックを行います。
	 * <br>
	 * @param inMsg 処理対象のメッセージキャリア
	 * @param inContext コンテキスト
	 * @param schemaID スキーマID
	 * @return 排他処理が成功した場合はtrue、成功しなかった場合はfalse
	 */
	public boolean succeededExclusiveLock(CAANMsg inMsg, AgentDispatchContext inContext, Object schemaID)
	{
		if (null == inMsg)
		{
			throw new IllegalArgumentException("inMsgの値が不正です。");
		}
		
		if (!(isNotUpdated(inMsg, (String)schemaID)))
		{
			return false;
		}
		try
		{
			findByKeyForUpdate(inMsg);
			return true;
		}
		catch (CAANFinderException cfe)
		{
			// ロック対象のレコードが存在しない場合
			return false;
		}
	}

}
