/*
 * LOGICAL-PARADOX.ORG
 * Copyright (C)2005 satoshi akabane(akabane@logical-paradox.org)
 * $Id: IndexGenerator.java,v 1.3 2005/06/19 15:14:34 rampil Exp $
 */
package org.logical_paradox.koike.tools.isys;

import java.io.File;

import org.logical_paradox.common.io.FileUtils;
import org.logical_paradox.koike.core.indexer.IndexAccessor;
import org.logical_paradox.koike.core.parser.Parser;
import org.logical_paradox.koike.core.parser.Term;

/**
 * ローカルで動作するスタブ用インデックスシステムで使用する、インデックスを生成するツール
 * 2-gramで適当に切り出して見やすいインデックスファイルを生成する<br>
 * ファイルフォーマットは通常のpropertiesファイルと同じ(キー=値)
 * @author satoshi akabane@logical-paradox.org
 * @version $Revision: 1.3 $
 */
public class IndexGenerator {
	/** デフォルトのデータ配置位置 */
	public static final String DEFAULT_DATA_PATH = StubProperty.getProperty("docs.stubs.isys");
	/** デフォルトのドキュメントエンコーディング(Unicode big-endian) */
	public static final String DEFAULT_DOCUMENT_ENCODING = "UnicodeBig";
	/** デフォルトのn-gram長 */
	public static final int DEFAULT_NGRAM_LENGTH = 2;

	/** ドキュメントデータパス */
	private final String datapath;
	/**
	 * コンストラクタ
	 * @param datapath 解析対象のドキュメントの存在するパス
	 */
	public IndexGenerator(String datapath_) {
		datapath = datapath_;
	}
	/**
	 * インデックスを生成する
	 * @throws Exception 生成処理中に発生した例外(unhandled)
	 */
	public void execute() throws Exception {
		// インデックスアクセサの生成
		IndexAccessor idxa = new StubIndexAccessor();

		File datadir = new File(datapath);
		if(datadir.isDirectory() == false) {
			throw new IllegalArgumentException("指定されたパスはディレクトリではありません");
		}

		// パーザーの生成
		Parser parser = new Parser(DEFAULT_NGRAM_LENGTH);

		File[] nodelist = datadir.listFiles();
		for(int i = 0; i < nodelist.length; i++) {
			if(
				nodelist[i].isDirectory() == false ||
				nodelist[i].getName().equals(".") ||
				nodelist[i].getName().equals("..") ||
				"CVS".equals(nodelist[i].getName())
			) {
				// ドットディレクトリか，またはディレクトリ以外の場合は無視する
				continue;
			}

			File[] documents = nodelist[i].listFiles();
			for(int j = 0; j < documents.length; j++) {		// j = ファイル番号
				if(documents[j].isFile() == false) {
					continue;
				}
				// ドキュメントファイルの解析
				String document = FileUtils.readFully(documents[j], DEFAULT_DOCUMENT_ENCODING);
				// n-gram索引の生成
				Term[] terms = parser.parse(document);
				idxa.addTerm(nodelist[i].getName() + ":" + j, terms);
			}
		}

		// 全てのノード/ファイルについて解析が完了したので
		// インデックスファイルを出力する
		idxa.close();
	}
	/**
	 * メインメソッド
	 * @param args プログラム引数
	 * @throws Exception 処理されなかった例外
	 */
	public static final void main(String[] args) throws Exception {
		String configfilename = DEFAULT_DATA_PATH;
		if(args.length == 1) {
			// 引数が1つの場合、パスが指定された
			configfilename = args[0];
		}

		System.out.println("スタブ用のインデックスファイルを出力します");

		IndexGenerator idxg = new IndexGenerator(configfilename);
		idxg.execute();

		System.out.println("スタブ用のインデックスファイルを出力しました");
	}
}
// end of IndexGenerator.java
