/*
このファイルの中身は、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) ______________________________________.
*/

//
//	ScormSetup
//	変更履歴
//		2004.02.01	新規作成
//

package jp.co.ntt.lms.lo.scorm;

import java.io.File;
import java.util.Hashtable;

import jp.co.ntt.lms.lo.LOException;
import jp.co.ntt.lms.lo.LoPropertyDef;
import jp.co.ntt.lms.lo.Setup;
import jp.co.ntt.lms.xmo.Lo.lom.LomDataAccess;
import jp.co.ntt.lms.xmo.util.DebugLog;

/**
 * SCORM LOセットアップインタフェースクラス。
 * LO登録・更新・削除にて、SCORM LO独自部分の動作を記述します。
 *
 * @author T.Nishiki
 */
public class ScormSetup extends Setup {
	/**
	 * セットアップ登録処理。<br>
	 * 教材の登録に伴い、以下の処理が実行されます。
	 * <ol>
	 * 	<li>SCORM LO個別テーブル（SCORMLOテーブル）にレコード登録します。</li>
	 * 	<li>
	 * 		パラメータの設定値により、
	 * 		教材構造定義ファイルをMATERIL_TEMPからMATERIL_PATHに移動します。
	 * 	</li>
	 * </ol>
	 *
	 * @param params パラメータ。<br>
	 * 以下の値が設定されていることを期待しています。<br>
	 * <table border="1">
	 * 	<tr>
	 * 		<th>キー</th>
	 * 		<th>値</th>
	 * 	</tr>
	 * 	<tr>
	 * 		<td>ScormLoPropertyDef.MATERIALID</td>
	 * 		<td>登録する教材ID</td>
	 * 	</tr>
	 * 	<tr>
	 * 		<td>ScormLoPropertyDef.COPY_FLAG</td>
	 * 		<td>教材構造定義ファイルを移動する場合、値を設定します。</td>
	 * 	</tr>
	 * 	<tr>
	 * 		<td>その他</td>
	 * 		<td>{@link ScormLoDataAccess#insert(Hashtable)}を参照</td>
	 * 	</tr>
	 * </table><br>
	 * @throws LOException データ挿入もしくはファイル移動でエラーが発生した場合。
	 * @see ScormLoDataAccess#insert(Hashtable)
	 */
	protected void setupInsert(Hashtable params) throws LOException {
		// メソッド開始ログ
		DebugLog.write(getClass(),
			"HEAD setupInsert(" + params + ")", DebugLog.ROW);
		try {
			////////////////////////////////////////////////////////////////////
			// SCORM LO個別テーブルにレコードを追加します。
			ScormLoDataAccess dataAccess = null;
			dataAccess = new ScormLoDataAccess();
			dataAccess.insert(params);
			////////////////////////////////////////////////////////////////////
			// 教材構造定義ファイルを移動します。
			// =================================================================
			String copyFlag = null;
			copyFlag = (String)params.get(ScormLoConstant.KEY_COPY_FLAG);
			DebugLog.write(getClass(),
				"copyFlag==null:" + (copyFlag == null), DebugLog.MID);
			// LOコピーではないとき（通常のLO登録）のときは移動
			if (copyFlag == null) {
				File manifestTempFile = null;
				File manifestPathFile = null;
				String materialID = null;
				// 教材IDを取得し、移動元／移動先のファイル・オブジェクトを取得
				materialID = (String)params.get(MATERIALID);
				manifestTempFile =
					ScormManifestUtil.getManifestTempFile(materialID);
				manifestPathFile =
					ScormManifestUtil.getManifestPathFile(materialID);
				// 移動実行（未登録ディレクトリ→登録済ディレクトリ）
				ScormLoUtil.moveFile(manifestTempFile, manifestPathFile);
			}
		}
		catch (LOException e) {
			throw e;
		}
		catch (Exception e) {
			DebugLog.write(getClass(), e, DebugLog.HIGHT);
			throw new LOException(e.getMessage());
		}

		// メソッド終了ログ
		DebugLog.write(getClass(),
			"TAIL setupInsert(" + params + ")", DebugLog.ROW);
	}

	/**
	 * セットアップ更新処理。<br>
	 * 教材の更新に伴い、
	 * <ol>
	 * 	<li>SCORM LO個別テーブル（SCORMLOテーブル）にレコード更新します。</li>
	 * </ol>
	 *
	 * @param params パラメータ。<br>
	 * 設定する値は、{@link ScormLoDataAccess#update(Hashtable)}を
	 * 参照してください。
	 *
	 * @throws LOException データ更新でエラーが発生した場合。
	 * @see ScormLoDataAccess#update(Hashtable)
	 */
	protected void setupUpdate(Hashtable params) throws LOException {
		// メソッド開始ログ
		DebugLog.write(getClass(),
			"HEAD setupUpdate(" + params + ")", DebugLog.ROW);

		ScormLoDataAccess dataAccess = new ScormLoDataAccess();
		dataAccess.update(params);

		// メソッド終了ログ
		DebugLog.write(getClass(),
			"TAIL setupUpdate(" + params + ")", DebugLog.ROW);
	}

	/**
	 * セットアップ登録処理。<br>
	 * 教材の登録に伴い、
	 * <ol>
	 * 	<li>SCORM LO個別テーブル（SCORMLOテーブル）からレコードを削除します。</li>
	 * 	<li>教材構造定義ファイルをMATERIL_PATHからMATERIL_TEMPに移動します。</li>
	 * </ol>
	 *
	 * @param params パラメータ。<br>
	 * 以下の値が設定されていることを期待しています。<br>
	 * <table border="1">
	 * 	<tr>
	 * 		<th>キー</th>
	 * 		<th>値</th>
	 * 	</tr>
	 * 	<tr>
	 * 		<td>ScormLoPropertyDef.MATERIALID</td>
	 * 		<td>登録する教材ID</td>
	 * 	</tr>
	 * 	<tr>
	 * 		<td>その他</td>
	 * 		<td>{@link ScormLoDataAccess#delete(Hashtable)}を参照</td>
	 * 	</tr>
	 * </table><br>
	 * @throws LOException データ削除もしくはファイル移動でエラーが発生した場合。
	 * @see ScormLoDataAccess#delete(Hashtable)
	 */
	protected void setupDelete(Hashtable params) throws LOException {
		// メソッド開始ログ
		DebugLog.write(getClass(),
			"HEAD setupDelete(" + params + ")", DebugLog.ROW);
		try {
			////////////////////////////////////////////////////////////////////
			// LOIDから教材IDを取得します。
			// =================================================================
			// LOIDだけをハッシュから抽出
			Hashtable condition = new Hashtable();
			String loid = (String)params.get(LoPropertyDef.LOID);
			condition.put(LoPropertyDef.LOID, loid);
			ScormLoDataAccess dataAccess = new ScormLoDataAccess();
			ScormLoData[] loData = dataAccess.getLoData(condition);
			String materialID = loData[0].getMaterialID();
			////////////////////////////////////////////////////////////////////
			// SCORM LO個別テーブルからレコードを削除します。
			dataAccess.delete(params);
			////////////////////////////////////////////////////////////////////
			// 教材構造定義ファイルを元の位置に移動します。
			// =================================================================
			File manifestTempFile = null;
			File manifestPathFile = null;
			// 教材IDを取得し、移動元／移動先のファイル・オブジェクトを取得
			manifestTempFile =
				ScormManifestUtil.getManifestTempFile(materialID);
			manifestPathFile =
				ScormManifestUtil.getManifestPathFile(materialID);
			// 移動実行（登録済ディレクトリ→未登録ディレクトリ）
			try {
				ScormLoUtil.moveFile(manifestPathFile, manifestTempFile);
			}
			// 移動に失敗してもエラーとしない
			catch (LOException e) {
				DebugLog.write(getClass(), e, DebugLog.HIGHT);
			}
		}
		catch (LOException e) {
			throw e;
		}
		catch (Exception e) {
			DebugLog.write(getClass(), e, DebugLog.HIGHT);
			throw new LOException(e.getMessage());
		}

		// メソッド終了ログ
		DebugLog.write(getClass(),
			"TAIL setupDelete(" + params + ")", DebugLog.ROW);
	}

	/**
	 * セットアップユーザ登録処理。<br>
	 * 特に動作しない。
	 * @deprecated SCORM LOではこのメソッドは有効ではありません。
	 * @param params パラメータ。（未使用）
	 */
	protected void setupAddUser(Hashtable params) {
	}

	/**
	 * セットアップユーザ削除処理。<br>
	 * 特に動作しない。
	 * @deprecated SCORM LOではこのメソッドは有効ではありません。
	 * @param params パラメータ。（未使用）
	 */
	protected void setupDelUser(Hashtable params) {
	}

	/**
	 * セットアップコピー処理。<br>
	 * 特に動作しない。
	 * @deprecated SCORM LOではこのメソッドは有効ではありません。
	 * @param params パラメータ。（未使用）
	 */
	protected void setupCopy(Hashtable params) {
	}
}
