/*
このファイルの中身は、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.sql.SQLException;
import java.util.Hashtable;
import java.util.Vector;

import org.apache.commons.lang.StringEscapeUtils;

import jp.co.ntt.lms.xmo.DataAccess;
import jp.co.ntt.lms.xmo.MessageData;
import jp.co.ntt.lms.xmo.XMOException;
import jp.co.ntt.lms.xmo.Message.Message;
import jp.co.ntt.lms.xmo.util.DebugLog;

/**
 *
 * このクラスは属性変更対象LOにより実行するクラスを決定します。
 * 
 * 属性変更対象LOが、
 *   複製なしの場合、ChangeTypeNoCopyLo
 *   複製元の場合、ChangeTypeBaseLo
 *   複製先の場合、ChangeTypeReferenceLo
 * を実行します。
 * 
 * @author A.Shimoma
 * 
 */
public class ChangeTypeFactory 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;
	/**
	 * データアクセスクラスのインスタンス
	 */
	DataAccess objDataAccess = null;
	/**
	 * ＬＯテーブルアクセスクラス
	 */
	LoDataAccess objLoDataAccess = null;
	/**
	 * 
	 */
	ChangeTypeAbstract changeType = null;

	/**
	 * 
	 * @param strLoID
	 * @param strUserID
	 * @param dataAccess
	 * @return
	 * @throws XMOException
	 */
	ChangeTypeAbstract getFactory(String strLoID, String strUserID, DataAccess dataAccess) throws XMOException {
		loID = strLoID;
		userID = strUserID;
		objDataAccess = dataAccess;
		init();
		return factory();
	}

	/**
	 * 初期化処理。
	 * この初期化処理では、LO情報の取得とLO参照情報の取得を行います。
	 * @throws XMOException
	 * 
	 */
	private void init() throws XMOException {

		// 検索用の文字列を組み立てる
		condition = " WHERE " + LO_ID + "='" + StringEscapeUtils.escapeSql(loID) + "'";
		objLoDataAccess = new LoDataAccess();
		// LO情報取得
		getLoInfo();
		// LO参照情報取得
		getCopyList();

	}

	/**
	 * 属性変更対象のLO情報を設定します。
	 * @throws XMOException
	 */
	private void getLoInfo() throws XMOException {

		Hashtable htbCondition = null;
		htbCondition = new Hashtable();
		htbCondition.put( CONDITION_KEY, condition );
		Vector vecLoType = objLoDataAccess.select( htbCondition );
		if( vecLoType.size() > 0 ) {
			LoData objTemp = (LoData)vecLoType.get(0);
			loType = objTemp.getLoType();
			realLoID = objTemp.getRealLOID();
		}
	}

	/**
	 * 属性変更するLOに参照を設定します。
	 * @throws XMOException
	 */
	private void getCopyList() throws XMOException {

		try {

			// 属性変更するLOに参照が存在するか、チェックする。
			copyList = objLoDataAccess.getCopyList(realLoID, objDataAccess);

		} catch (SQLException se) {
			DebugLog.write( this.getClass(), se, DebugLog.HIGHT );
			throw new XMOException(getMessageData(DB_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;
	}

	/**
	 * 条件に似合ったサブクラスを返します。
	 * 
	 * @return ChangeTypeAbstractのサブクラス
	 * @throws XMOException
	 */
	private ChangeTypeAbstract factory() throws XMOException {

		// 他参照が存在しない場合
		if(copyList.size()==1){
			changeType = new ChangeTypeNoCopyLo();
		}
		// 他参照が存在し、属性変更対象LOが複製元の場合
		else if (loID.equals(realLoID)) {
			changeType = new ChangeTypeBaseLo();
		}
		// 他参照が存在し、属性変更対象LOが複製されたLOである場合、
		else {
			changeType = new ChangeTypeReferenceLo();
		}

		// 属性変更処理へのパラメータ引継ぎ
		setParams();
		// 属性変更処理で使用するオブジェクトのインスタンス生成
		changeType.getInstance();

		return changeType;
	}

	/**
	 * 属性変更処理に必要なデータの設定を行います。
	 *
	 */
	private void setParams() {
		// LOIDを設定
		changeType.setLoID(loID);
		// ユーザIDを設定
		changeType.setUserID(userID);
		// リアルLOIDを設定
		changeType.setRealLoID(realLoID);
		// LOタイプを設定
		changeType.setLoType(loType);
		// 検索条件を設定
		changeType.setCondition(condition);
		// 他参照リストを設定
		changeType.setCopyList(copyList);
		// データアクセスオブジェクトを設定 
		changeType.setDataAccess(objDataAccess);
	}
}
