/*
このファイルの中身は、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) ______________________________________.
*/
//
//
//	SCORM教材構造変換クラス
//			変更履歴
//				2004/01/08	新規作成	二條智文

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

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

import jp.co.ntt.lms.lo.*;
import jp.co.ntt.lms.xmo.util.*;

// XCMIモジュール
//@20040622 DEL NTTR
//import jp.co.ntt.lms.Common.XCMI.*;

// RDFモジュール
import jp.co.ntt.lms.Common.RDF.*;

/**
 * SCORM教材構造変換クラスです。<BR>
 * @author T.Nijou
 * @version 0.0.0.1 2004/01/08
 */
public class WbtMaterialConverter {

	private static Class THIS_CLASS = new WbtMaterialConverter().getClass();

	private static final Hashtable mhtbMaterialID = new Hashtable();
	private static final Hashtable mhtbMaterialFile = new Hashtable();

	/**
	 * 教材IDを元に教材構造ファイルを読み込み展開します
	 * @param strMaterialID 教材ID
	 */
	public static WbtNode convertFromID(String strMaterialID) {

		return (WbtNode) mhtbMaterialID.get(strMaterialID);
	}

	/**
	 * 指定されたファイルを読み込み、展開します
	 * @param strFilePath ファイルフルパス
	 * @return WbtNode 展開されたノードオブジェクト
	 */
	public static WbtNode convert(String strFilePath) throws LOException {

		if (strFilePath == null) {
			return null;
		}

		// キャッシュから取得
		WbtNode objWbtNode = (WbtNode) mhtbMaterialFile.get(strFilePath);
		if (objWbtNode != null) {
			return objWbtNode;
		}
		try {
//			@20040622 DEL NTTR
		 /*
			try {
				// DOMツリー生成
				IXCMIDocument objDocument = new IXCMIDocument();
				objDocument.load(strFilePath);

				IXCMIManifest objNode =
					(IXCMIManifest) objDocument.get_firstChild();

				// コースノードの検索を行います
				IXCMINode objCourseNode = searchCourse(objNode);

				if (objCourseNode == null) {
					return null;
				}

				objWbtNode =
					new WbtNode(
						null,
						((IXCMIcourse) objCourseNode).get_Identifier(),
						((IXCMIcourse) objCourseNode).get_Title());
				objWbtNode.setMaterialID(
					((IXCMIcourse) objCourseNode).get_Identifier());

				parseScorm(objCourseNode, objWbtNode);

			} catch (Exception e) {
				try {
*/
					RDFDocument objDocument = new RDFDocument();
					RDFNode objRDFNode = objDocument.load(strFilePath);
					objWbtNode =
						new WbtNode(
							null,
							objRDFNode.getID(),
							objRDFNode.getTitle());
					objWbtNode.setMaterialID(objRDFNode.getMaterialID());
					parseRDF(objRDFNode, objWbtNode);
/*
				} catch (Exception ex) {
					throw ex;
				}
			}
*/
		} catch (Exception e) {
			DebugLog.write(THIS_CLASS, e, DebugLog.HIGHT);
			throw new LOException(e.getMessage());
		}

		// キャッシュに格納
		mhtbMaterialFile.put(strFilePath, objWbtNode);
		mhtbMaterialID.put(objWbtNode.getMaterialID(), objWbtNode);
		return objWbtNode;

	}

	/**
	 * XCMIノードオブジェクトからCOURSEノードを検索します
	 * @param objNode 検索対象ノード
	 */
/*
	private static IXCMINode searchCourse(IXCMINode objNode) {
		if (objNode == null) {
			return null;
		}

		if (objNode.get_nodeType() == IXCMINode.NODE_COURSE) {
			return objNode;
		} else {
			IXCMINodeList objNodeList = objNode.get_childNodes();
			if (objNodeList != null && objNodeList.get_length() > 0) {
				for (int i = 0; i < objNodeList.get_length(); i++) {
					IXCMINode objChildNode = searchCourse(objNodeList.item(i));
					if (objChildNode != null) {
						return objChildNode;
					}
				}
			}
		}
		return null;
	}

	private static void parseScorm(
		IXCMINode objNode,
		WbtNode objWbtParentNode) {

		// ノードが取得できなかったまたは、コースノード、ブロックノードの
		// 場合は子ノードを取得します
		IXCMINodeList objNodeList = objNode.get_childNodes();
		if (objNodeList != null && objNodeList.get_length() > 0) {
			for (int i = 0; i < objNodeList.get_length(); i++) {
				if (objNodeList.item(i).get_nodeType() == IXCMINode.NODE_BLOCK
					|| objNodeList.item(i).get_nodeType() == IXCMINode.NODE_AU) {
					WbtNode objWbtChildNode =
						getWbtNode(objNodeList.item(i), objWbtParentNode);
					// ブロックタイプのみ再帰呼び出し
					if (objNodeList.item(i).get_nodeType()
						== IXCMINode.NODE_BLOCK) {
						parseScorm(objNodeList.item(i), objWbtChildNode);
					}
				}
			}
		}
	}
*/
/*
	private static WbtNode getWbtNode(
		IXCMINode objNode,
		WbtNode objWbtParentNode) {

		WbtNode objWbtNode = null;

		if (objNode.get_nodeType() == IXCMINode.NODE_BLOCK) {
			IXCMIblock objBlock = (IXCMIblock) objNode;
			objWbtNode =
				new WbtNode(
					objWbtParentNode,
					objBlock.get_Id(),
					objBlock.get_Identification_Title());
			// ノード種別をコースに設定
			objWbtNode.setNodeType(WbtNode.BLOCK_TYPE);
		} else if (objNode.get_nodeType() == IXCMINode.NODE_AU) {
			IXCMIau objAu = (IXCMIau) objNode;
			objWbtNode =
				new WbtNode(
					objWbtParentNode,
					objAu.get_Id(),
					objAu.get_Identification_Title());
			// ノード種別をコースに設定
			objWbtNode.setNodeType(WbtNode.AU_TYPE);
		}

		return objWbtNode;
	}
*/
	/**
	 *
	 */
	private static void parseRDF(
		RDFNode objRDFNode,
		WbtNode objWbtParentNode) {
		RDFNodeList objList = objRDFNode.getChildNodes();
		for (int i = 0; i < objList.getLength(); i++) {
			RDFNode objRDFChild = objList.getNode(i);
			WbtNode objWbtChildNode =
				new WbtNode(
					objWbtParentNode,
					objRDFChild.getID(),
					objRDFChild.getTitle());
			// ノード種別の設定
			objWbtChildNode.setNodeType(objRDFChild.getNodeType());

			// 再帰呼び出し
			parseRDF(objRDFChild, objWbtChildNode);
		}
	}
}