/*
 * $Id: Indexer.java,v 1.3 2005/05/31 14:38:19 rampil Exp $
 * Copyright (c) 2004 LOGICAL-PARADOX.ORG
 */
package org.logical_paradox.koike.core.indexer;

import java.io.FileInputStream;
import java.util.Properties;

import org.logical_paradox.koike.core.KoikeConfig;
import org.logical_paradox.koike.core.KoikeConstant;
import org.logical_paradox.koike.core.logging.LogFactory;
import org.logical_paradox.koike.core.logging.Logger;

/**
 * インデクサ
 * 
 * @author satoshi akabane@logical-paradox.org
 * @version $Revision: 1.3 $
 */
public class Indexer {
	// ロガー
	private Logger log = LogFactory.getLogger();

	// コンフィグレーション
	private KoikeConfig config;
	// インデクサスレッド
	private IndexerThread[] indexers;

	/**
	 * コンストラクタ
	 */
	public Indexer() {
	}
	/**
	 * コンフィグファイルをロードする
	 * @param filename ファイル名
	 * @throws IOException ロードに失敗した
	 */
	public void loadConfig(String filename) throws Exception {
		log.write("**** コンフィグファイルをロードしています ****");

		Properties prop = new Properties();
		prop.load(new FileInputStream(filename));

		// コンフィグレーションの生成
		config = new KoikeConfig(prop);
	}
	/**
	 * インデクサを開始する
	 * @throws Exception
	 */
	public void begin() throws Exception {
		log.write("**** インデクサを開始しています ****");
		int threadCount = config.getIndexerThreads();

		log.write("**** インデクサを" + threadCount + "個生成しました ****");

		// スレッドの作成と開始
		indexers = new IndexerThread[threadCount];
		for(int i = 0; i < threadCount; i++) {
			indexers[i] = new IndexerThread(config);
			indexers[i].start();
		}
		for(int i = 0; i < threadCount; i++) {
			indexers[i].join();
		}
		log.write("**** インデクサを終了しました ****");
	}
	/**
	 * メインメソッド
	 * 
	 * @param args プログラム引数
	 * @throws Exception 実行中に発生した例外
	 */
	public static void main(String[] args) throws Exception {
		Indexer indexer = new Indexer();
		String configfilename = null;
		if(args.length == 0) {
			configfilename = KoikeConstant.DEFAULT_CONFIG_FILEPATH;
		} else {
			configfilename = args[0];
		}

		indexer.loadConfig(configfilename);

		indexer.begin();
	}
}
