/*
このファイルの中身は、NTT オープンソースライセンス　バージョン 1.0（「本
契約」という）の適用を受けます。
本契約を遵守しない限り、このファイルを使用してはなりません。
本契約のコピーは、次のＵＲＬから入手できます。
【配布サイトのURL】 http://www.oss.ecl.ntt.co.jp/lms/

本契約に基づき頒布されるソフトウェアは、現状のまま、明示又は黙示のあらゆ
る種類の保証なしで、頒布されます。本契約に基づく権利及び制限を律する特定
の文言については、本契約を参照してください。

「オリジナルコード」は、 NTT Cyber Space Laboratories Code です。 
「オリジナルコード」の「初期開発者」は、日本電信電話株式会社です。  
日本電信電話株式会社により創作された部分は、Copyright (C) 2004 
日本電信電話株式会社 です。
全ての権利が留保されます。 
「コントリビュータ」：_____________________________________ 


The contents of this file are subject to the NTT Opensource License
Version 1.0 (the License); you may not use this file except in
compliance with the License. You may obtain a copy of the License at
【配布サイトのURL】 http://www.oss.ecl.ntt.co.jp/lms/

Software distributed under the License is distributed on an AS IS
basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the
License for the specific language governing rights and limitations
under the License.

The Original Code is NTT Cyber Space Laboratories Code .

The Initial Developer of the Original Code is NIPPON TELEGRAPH AND 
TELEPHONE CORPORATION.
Portions created by the NIPPON TELEGRAPH AND TELEPHONE CORPORATION 
are Copyright (C) 2004 NIPPON TELEGRAPH AND TELEPHONE CORPORATION. 
All Rights Reserved.

Contributor(s) ______________________________________.
*/

//
//	属性変更 抽象化クラス
//			変更履歴
//				2004.07.21 新規作成 A.Shimoma
//								
//
package jp.co.ntt.lms.xmo.Lo;

import java.util.Hashtable;
import java.util.Vector;

import jp.co.ntt.lms.lo.LoLogSessionDataAccess;
import jp.co.ntt.lms.lo.LoTopClient;
import jp.co.ntt.lms.xmo.DataAccess;
import jp.co.ntt.lms.xmo.Environment;
import jp.co.ntt.lms.xmo.MessageData;
import jp.co.ntt.lms.xmo.XMOException;
import jp.co.ntt.lms.xmo.Evaluate.EvaluateDataAccess;
import jp.co.ntt.lms.xmo.Lo.LoLogDelete.LogUtil;
import jp.co.ntt.lms.xmo.Message.Message;
import jp.co.ntt.lms.xmo.util.DebugLog;

/**
 * 
 * このクラスは属性変更の抽象クラスです。 実装はサブクラスで行ってください。
 * 
 * 属性変更共通ロジックはこのクラスに実装しています。
 * 
 * @author A.Shimoma
 *  
 */
public abstract class ChangeTypeAbstract implements LoTable, LoMessage {

	/**
	 * LOID
	 */
	String loID = null;

	/**
	 * LOTYPE
	 */
	String loType = null;

	/**
	 * リアルLOID
	 */
	String realLoID = null;

	/**
	 * ユーザID
	 */
	String userID = null;

	/**
	 * 他参照がある場合に使用する最小LOID
	 */
	String newLoID = null;

	/**
	 * DBアクセス検索条件
	 */
	String condition = null;

	/**
	 * 他参照リスト
	 */
	Vector copyList = null;

	/**
	 * LOテーブル変更用ハッシュパラメータ
	 */
	Hashtable loData = new Hashtable();

	/**
	 * LOトップクライアントクラスのインスタンス
	 */
	LoTopClient objLoTop = null;

	/**
	 * 共通ログユーティリティクラスのインスタンス
	 */
	LogUtil objLogUtil = null;

	/**
	 * データアクセスクラスのインスタンス
	 */
	DataAccess objDataAccess = null;

	/**
	 * ログセッションデータアクセスクラスのインスタンス
	 */
	LoLogSessionDataAccess objLogSession = null;

	/**
	 * 評価データアクセスクラス
	 */
	EvaluateDataAccess objEvalute = null;

	/**
	 * ＬＯテーブルアクセスクラス
	 */
	LoDataAccess objLoDataAccess = null;


	/**
	 * コンストラクタ。
	 *  
	 */
	public ChangeTypeAbstract() {
	}

	/**
	 * 属性変更処理で使用するオブジェクトのインスタンスを生成します。
	 * 
	 * @throws XMOException
	 *  
	 */
	void getInstance() throws XMOException {

		try{

			// LO種別を元にLOサーバに接続
			Environment objEnv = new Environment();
			String strLoServer = objEnv.getLoServerName();
			objLoTop = new LoTopClient( strLoServer, loType );

			objLogUtil = new LogUtil();

			objLogSession = new LoLogSessionDataAccess();

			objEvalute = new EvaluateDataAccess();

			objLoDataAccess = new LoDataAccess();

		} catch ( Exception e ){
			DebugLog.write( this.getClass(), e, DebugLog.HIGHT );
			throw new XMOException( getMessageData( SYSTEM_ERR ) );
		}
	}

	/**
	 * メッセージオブジェクトを作成します。
	 * 
	 * @param strMessageID メッセージID
	 * @return MessageData メッセージオブジェクト 例外発生時はnullを返します
	 */
	MessageData getMessageData( String strMessageID ) {
		MessageData objMessage = null;
		try{
			objMessage = Message.getInstance().getMessageData( strMessageID,
				MSG_FIEL_PATH, MSG_FILE_NAME );
		} catch ( Exception e ){

		}
		return objMessage;
	}

	/**
	 * 
	 * LOテーブルへ更新するデータをハッシュパラメータへ格納し、
	 * LOテーブルの更新を行います。
	 * 
	 * @param strLoID LOID
	 * @param strRealLoID リアルLOID
	 * @param strLoType LOType
	 * @param strCondition 検索条件
	 * @throws XMOException
	 */
	void putLoTableData(
		String strLoID,
		String strRealLoID,
		String strLoType,
		String strCondition ) throws XMOException {

		loData = new Hashtable();

		loData.put( LO_ID, strLoID );
		loData.put( REAL_LOID, strRealLoID );
		if ( ( strLoType == null || strLoType.length() == 0 ) == false ){
			loData.put( LO_TYPE, strLoType );
		}
		// 更新条件を格納する
		loData.put( CONDITION_KEY, strCondition );
		changeLoTable( loData );
	}

	/**
	 * 
	 * LOテーブルの更新を行います。
	 * 
	 * @param htbUpdate
	 * @throws XMOException
	 */
	void changeLoTable( Hashtable htbUpdate ) throws XMOException {

		//---------------------
		// LOテーブル更新
		//---------------------

		// トランザクション共有のために現在使用中のコネクションインデックスを取得する
		Integer objConIndex = getConnectionIndex();

		// コネクションインデックスを指定
		htbUpdate.put( DataAccess.CONNECTIONINDEX, objConIndex );

		// 更新処理実行
		objLoDataAccess.loDataUpdate( htbUpdate );
	}

	// 最小LOID取得処理
	void setMinimumLoID() {
	}

	/**
	 * 現在使用中のコネクションインデックスを取得します。
	 * 
	 * @return connectionIndex コネクションインデックス
	 */
	Integer getConnectionIndex() {
		Integer connectionIndex = null;
		// トランザクション共有のために現在使用中のコネクションインデックスを取得する
		connectionIndex = new Integer( objDataAccess.getConnectionIndex() );
		return connectionIndex;
	}

	/**
	 * LOIDを設定します。
	 * 
	 * @param strLoID
	 */
	void setLoID( String strLoID ) {
		loID = strLoID;
	}

	/**
	 * ユーザIDを設定します。
	 * 
	 * @param strUserID
	 */
	void setUserID( String strUserID ) {
		userID = strUserID;
	}

	/**
	 * リアルLOIDを設定します。
	 * 
	 * @param strRealLoID
	 */
	void setRealLoID( String strRealLoID ) {
		realLoID = strRealLoID;
	}

	/**
	 * LOタイプを設定します。
	 * 
	 * @param strLoType
	 */
	void setLoType( String strLoType ) {
		loType = strLoType;
	}

	/**
	 * 検索条件をを設定します。
	 * 
	 * @param strCondition
	 */
	void setCondition( String strCondition ) {
		condition = strCondition;
	}

	/**
	 * 他参照リストを設定します。
	 * 
	 * @param vecCopyList
	 */
	void setCopyList( Vector vecCopyList ) {
		copyList = vecCopyList;

	}

	/**
	 * データアクセスオブジェクトを設定します。
	 * 
	 * @param dataAccess
	 */
	void setDataAccess( DataAccess dataAccess ) {
		objDataAccess = dataAccess;

	}

	// LO情報変更アクションメソッド
	abstract void changeLoAction() throws XMOException;

	// ログセッション情報変更アクションメソッド
	abstract void changeLoLogSessionAction() throws XMOException;

	// 共通ログ情報変更アクションメソッド
	abstract void changeLoLogAction() throws XMOException;

	// 評価情報変更アクションメソッド
	abstract void changeEvaluteAction() throws XMOException;

	// 更新履歴情報変更アクションメソッド
	abstract void changeLoHistoryAction() throws XMOException;

	// 個別ログ情報変更アクションメソッド
	abstract void changeIndividualLogAction() throws XMOException;

	// 各LO個別情報変更アクションメソッド
	abstract void changeOriginalLoAction() throws XMOException;

}