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

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

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

import java.io.File;
import java.util.Properties;

import jp.co.ntt.lms.lo.LOException;
import jp.co.ntt.lms.xmo.util.DebugLog;

import org.apache.xpath.XPathAPI;
import org.w3c.dom.Document;
import org.w3c.dom.Node;

/**
 * SCORM教材構造データに関するユーティリティメソッドを提供するクラス。
 * @author T.Nishiki
 */
public class ScormManifestUtil {

	/**
	 * 指定した教材IDに対応する教材構造ファイルのDOMDocumentを取得します。<br>
	 *
	 * @param materialListPath 教材構造ファイルのあるパス。
	 * @param materialID 取得する教材の教材ID。
	 * @return materialIDに対応する教材構造定義ファイルのDOMDocument。
	 *          対応する教材構造定義ファイルが存在しない場合は、nullを戻します。
	 */
	public static Document getManifestXmlDocument(
		String materialListPath,
		String materialID) {
		// メソッド開始ログ
		DebugLog.write(
			ScormManifestUtil.class,
			"HEAD getManifestXmlDocument("
				+ materialListPath + "," + materialID + ")",
			DebugLog.ROW);

		// 教材構造ファイルを表すオブジェクト。
		File manifestFile = null;
		// このメソッドの戻り値
		Document document = null;

		// 教材構造ファイル・オブジェクトを取得。
		manifestFile = getManifestFile(materialListPath, materialID);
		try {
			// DOM Documentに変換。
			document = ScormLoUtil.transformXmlFileToDocument(manifestFile);
		}
		catch (Exception e) {
			// 例外が発生しても無視します。
		}

		// メソッド終了ログ
		DebugLog.write(
			ScormManifestUtil.class,
			"TAIL getManifestXmlDocument("
				+ materialListPath + "," + materialID + ")"
				+ " return " + document,
			DebugLog.ROW);
		return document;
	}

	/**
	 * 指定した教材IDに対応する教材構造ファイルのXMLデータを取得します。<br>
	 *
	 * @param materialListPath 教材構造ファイルのあるパス。
	 * @param materialID 取得する教材の教材ID。
	 * @param outFormat 出力オプション・プロパティ。
	 * @return materialIDに対応する教材構造定義ファイルのXML文字列。
	 *          対応する教材構造定義ファイルが存在しない場合は、空文字列を戻します。
	 * @see javax.xml.transform.Transformer#setOutputProperties(Properties)
	 *       出力オプション・プロパティ。
	 */
	public static String getManifestXmlString(
		String materialListPath,
		String materialID,
		Properties outFormat) {
		// メソッド開始ログ
		DebugLog.write(
			ScormManifestUtil.class,
			"HEAD getManifestXmlString("
				+ materialListPath + "," + materialID + ")",
			DebugLog.ROW);

		// このメソッドの戻り値
		String xmlString = null;
		try {
			File manifestFile = getManifestFile(materialListPath, materialID);
			xmlString = ScormLoUtil.transformXmlFileToString(
					manifestFile, outFormat);
		}
		catch (Exception e) {
			// 例外が発生しても無視します。
			DebugLog.write(ScormManifestUtil.class, e, DebugLog.HIGHT);
			xmlString = "";
		}

		// メソッド終了ログ
		DebugLog.write(
			ScormManifestUtil.class,
			"TAIL getManifestXmlString("
				+ materialListPath + "," + materialID + ")"
				+ " return " + xmlString,
			DebugLog.ROW);
		return xmlString;
	}

	/**
	 * 教材構造定義から、教材IDを取得します。
	 * @param manifestDoc 教材構造定義XMLのDOM Document。
	 * @return 教材IDを取得できた場合はその値を、
	 *          取得できなかった場合nullを戻します。
	 */
	public static String getMaterialID(Document manifestDoc) {
		// メソッド開始ログ
		DebugLog.write(
			ScormManifestUtil.class,
			"HEAD getMaterialID(" + manifestDoc + ")",
			DebugLog.ROW);

		String materialID = null;
		Node materialIDNode = null;
		try {
			materialIDNode =
				XPathAPI.selectSingleNode(
					manifestDoc,
					ScormLoConstant.XPATH_MATERIAL_ID);
			materialID = materialIDNode.getNodeValue();
		}
		catch (Exception e) {
			// 例外が発生しても無視します。
			DebugLog.write(ScormManifestUtil.class, e, DebugLog.HIGHT);
		}

		// メソッド終了ログ
		DebugLog.write(
			ScormManifestUtil.class,
			"TAIL getMaterialID(" + manifestDoc + ")"
				+ " return " + materialID,
			DebugLog.ROW);
		return materialID;
	}

	/**
	 * 教材構造定義から、教材タイトルを取得します。
	 * @param manifestDoc 教材構造定義XMLのDOM Document。
	 * @return 教材タイトルを取得できた場合はその値を、
	 *          取得できなかった場合nullを戻します。
	 */
	public static String getMaterialTitle(Document manifestDoc) {
		// メソッド開始ログ
		DebugLog.write(
			ScormManifestUtil.class,
			"HEAD getMaterialTitle(" + manifestDoc + ")",
			DebugLog.ROW);

		String materialTitle = null;
		Node materialTitleNode = null;
		try {
			materialTitleNode =
				XPathAPI.selectSingleNode(
					manifestDoc,
					ScormLoConstant.XPATH_MATERIAL_TITLE);
			materialTitle = materialTitleNode.getNodeValue();
		}
		catch (Exception e) {
			// 例外が発生しても無視します。
			DebugLog.write(ScormManifestUtil.class, e, DebugLog.HIGHT);
		}

		// メソッド終了ログ
		DebugLog.write(
			ScormManifestUtil.class,
			"TAIL getMaterialTitle(" + manifestDoc + ")"
				+ " return " + materialTitle,
			DebugLog.ROW);
		return materialTitle;
	}

	/**
	 * 未登録のSCORM教材の教材構造定義ファイルを取得します。<br>
	 *
	 * @param materialID 教材ID。
	 * @return 教材構造定義ファイルを表すファイル・オブジェクト。
	 * @throws LOException 設定ファイルから情報の取得に失敗した場合
	 */
	public static File getManifestTempFile(String materialID)
		throws LOException {

		// メソッド開始ログ
		DebugLog.write(
			ScormManifestUtil.class,
			"HEAD getManifestTempFile(" + materialID + ")",
			DebugLog.ROW);

		ScormLoEnv env = new ScormLoEnv();
		String materialTempPath = env.getTempMaterialPath();
		File manfestTempFile = getManifestFile(materialTempPath, materialID);

		// メソッド終了ログ
		DebugLog.write(
			ScormManifestUtil.class,
			"TAIL getManifestTempFile(" + materialID + ")"
				+ " return " + manfestTempFile,
			DebugLog.ROW);
		return manfestTempFile;
	}

	/**
	 * 登録済のSCORM教材の教材構造定義ファイルを取得します。<br>
	 *
	 * @param materialID 教材ID。
	 * @return 教材構造定義ファイルを表すファイル・オブジェクト。
	 * @throws LOException 設定ファイルから情報の取得に失敗した場合
	 */
	public static File getManifestPathFile(String materialID)
		throws LOException {
		// メソッド開始ログ
		DebugLog.write(
			ScormManifestUtil.class,
			"HEAD getManifestPathFile(" + materialID + ")",
			DebugLog.ROW);

		ScormLoEnv env = new ScormLoEnv();
		String materialTempPath = env.getMaterialPath();
		File manfestPathFile = getManifestFile(materialTempPath, materialID);

		// メソッド終了ログ
		DebugLog.write(
			ScormManifestUtil.class,
			"TAIL getManifestPathFile(" + materialID + ")"
				+ " return " + manfestPathFile,
			DebugLog.ROW);
		return manfestPathFile;
	}

	/**
	 * 教材構造ファイルのFileオブジェクトを取得します。<br>
	 * @param materialListPath 教材構造ファイルのあるパス。
	 * @param materialID 取得する教材の教材ID。
	 * @return materialListPath、materialIDから判断できる
	 *          教材構造ファイルのFileオブジェクトを戻します。
	 */
	private static File getManifestFile(
		String materialListPath,
		String materialID) {

		// このメソッドの戻り値
		File manifestFile = null;
		// 教材構造ファイルをパス生成します。
		manifestFile =
			new File(
				new File(materialListPath, materialID),
				ScormLoConstant.MANIFEST_FILE_NAME);
		return manifestFile;
	}
}
