//
// CopyRight (C) 2002, IPA, eLC, NTT Resonant Inc. All rights reserved.
//
//	Default
//
//	変更履歴
//		2002.12.25  新規作成
//

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

import java.io.IOException;

import javax.xml.parsers.ParserConfigurationException;

import jp.co.ntt.lms.lo.scorm.kernel.exception.SystemException;
import jp.co.ntt.lms.lo.scorm.util.CachedNode;
import jp.co.ntt.lms.lo.scorm.util.XMLUtil;

import org.w3c.dom.Document;
import org.xml.sax.SAXException;

/**
*  Defaultクラス<BR>
*  Sequencingルールのデフォルト値を取得するクラス<BR>
*/
public class Default {
	/** "Default.xml"のDOM Document */
	private static Document doc;

	/** "Default.xml"のルートノード */
	private static CachedNode sequencing;

	/**
	 * デフォルトコンストラクタ
	 */
	private Default() {}

	/**
	 * 初期化
	 */
	private static void initialize() throws IOException, ParserConfigurationException, SAXException {
		synchronized (Default.class) {
			if (doc == null) {
				doc = XMLUtil.newDocumentBuilder(false).parse(Default.class.getResource("/conf/scorm/Default.xml").toString());

				sequencing = new CachedNode(doc.getDocumentElement());
			}
		}
	}

	/**
	 * デフォルト値の取得<BR>
	 *
	 * @param  xpath	デフォルト値へのxpath<BR>
	 * @return デフォルト文字列<BR>
	 */
	public static String getValue(String xpath) throws SystemException {
		try {
			initialize();

			CachedNode value = sequencing.selectSimpleSingleNode(xpath);

			if (value == null) {
				throw new SystemException("デフォルト値が存在しません[" + xpath + "]");
			}

			return value.getNodeValue();
		}
		catch (SystemException ex) {
			throw ex;
		}
		catch (Exception ex) {
			throw new SystemException("デフォルト値の取得に失敗しました。", ex);
		}
	}

	/**
	 * デフォルトのノードの取得<BR>
	 *
	 * @param   xpath 取得したいノードのエレメント文字列<BR>
	 * @return  ノード<BR>
	 */
	public static CachedNode getNode(String xpath) throws SystemException {
		try {
			initialize();

			CachedNode node = sequencing.selectSimpleSingleNode(xpath);

			if (node == null) {
				throw new SystemException("デフォルト値が存在しません[" + xpath + "]");
			}

			return node;
		}
		catch (Exception ex) {
			throw new SystemException("デフォルト値の取得に失敗しました。", ex);
		}
	}

	/**
	 * デフォルトのノードリストの取得<BR>
	 *
	 * @param  xpath 取得したいノードリストのエレメント名<BR>
	 * @return ノードリスト<BR>
	 */
	public static CachedNode[] getNodeList(String xpath) throws SystemException {
		try {
			initialize();

			CachedNode nodes[] = sequencing.selectSimpleNodeList(xpath);

			if ((nodes == null) || (nodes.length <= 0)) {
				throw new SystemException("デフォルト値が存在しません[" + xpath + "]");
			}

			return nodes;
		}
		catch (Exception ex) {
			throw new SystemException("デフォルト値の取得に失敗しました。", ex);
		}
	}
}
