/////////////////////////////////////////////////////////////////
//Copyright (C) 2005 NTT CORPORATION.
//
//LoInfo オブジェクトリスト生成クラス
//
//変更履歴
//2005.02.03  新規作成  森　智志
//
//機能
//
//SCORMに含まれるマニフェストを格納するためのリストクラスです。
//
/////////////////////////////////////////////////////////////////
package jp.co.ntt.lms.lo.lom.learnableinfo;

import java.io.File;
import java.util.*;

import jp.co.ntt.lms.lo.LOException;
import jp.co.ntt.lms.lo.scorm.ScormLoEnv;

/**
 * SCORMに含まれるマニフェストを格納するためのリストクラスです。
 * 1つのマニフェストファイルには１つまたは複数の manifest ノードが存在するため、
 * マニフェストノードをリスト形式で管理します。
 * @author s-mori
 * @version 1.0
 */
public class ManifestFileList {

	/** SCORMLoEnv オブジェクト */
	private ScormLoEnv scormEnv = null;
	
	/** マニフェストディレクトリ */
	private File manifestDirectory = null;
	
	/** マニフェストファイルのリスト */
	private List fileList = null;
	
	/** 現在のマニフェストノードのインデックス番号 */
	private int index = -1;

	/** マニフェストファイルの名前 */
	private static final String MANIFEST_FILE = "imsmanifest.xml";
	
	/**
	 * コンストラクタ。
	 * @throws LOException ScormLoEnvオブジェクトの作成に失敗した場合
	 */
	public ManifestFileList() throws LOException{
		
		// scorm.ini 読込
		this.scormEnv = new ScormLoEnv();
		
		// manifest が登録されているパス(material_path)を取得
		this.manifestDirectory = new File(this.scormEnv.getMaterialPath());
		
		// リストオブジェクトを作成
		this.fileList = new ArrayList();
		
	}
	

	/*
	public void addAllPath(){
		
		File[] list = this.manifestDirectory.listFiles();
		
		for(int i = 0; i < list.length; i++){
			this.fileList.add(list[i].getPath() + File.separator + MANIFEST_FILE);
		}
		
	}
	*/
	
	/**
	 * マニフェストのパスを追加します。
	 * @param path マニフェストのパス
	 */
	public boolean addPath(String path){
		if(path == null || path.equals("")){
			return false;
		}
		
		File file = new File(path);
		if(!file.exists() || !file.isDirectory()){
			return false;
		}
		
		this.fileList.add(path + File.separator + MANIFEST_FILE);		
		
		return true;
		
	}
	
	
	/**
	 * 次のマニフェストへ移動します。
	 * @return 次のマニフェストがあればtrue
	 */
	public boolean next(){
		index++;
		return (index < fileList.size());
	}
	
	/**
	 * 現在のマニフェストをFileオブジェクトで取得します。
	 * @return 現在のマニフェスト
	 */
	public File get(){
		return this.get(this.index);
	}
	
	/**
	 * 指定されたインデックスに相当するマニフェストをFileオブジェクトで取得します。
	 * @param i インデックス番号
	 * @return インデックスに相当するマニフェスト
	 */
	public File get(int i){
		return new File((String)this.fileList.get(i));
	}
	
}
