/*
 * LOGICAL-PARADOX.ORG
 * Copyright (C)2005 satoshi akabane(akabane@logical-paradox.org)
 * $Id: FullTextSearchApplicationPack.java,v 1.5 2006/02/15 16:24:00 rampil Exp $
 */
package org.logical_paradox.koike.tools.ri;

import java.util.Properties;

import javax.swing.JTextField;

import org.logical_paradox.koike.core.KoikeConfig;
import org.logical_paradox.koike.core.KoikeConstant;
import org.logical_paradox.koike.core.search.Element;
import org.logical_paradox.koike.core.search.ResultSet;
import org.logical_paradox.koike.core.search.SearchCondition;
import org.logical_paradox.koike.core.search.SearchEngine;
import org.logical_paradox.koike.core.search.SearchResult;
import org.logical_paradox.koike.tools.console.ApplicationPack;

/**
 * FullTextSearchApplicationPack
 * 全文検索アプリケーションのコンソール
 * @author satoshi akabane@logical-paradox.org
 * @version $Revision: 1.5 $
 */
public class FullTextSearchApplicationPack extends ApplicationPack {
	/** 全文検索エンジン */
	protected SearchEngine core;

	/**
	 * コンストラクタ
	 */
	public FullTextSearchApplicationPack() {
		super();
	}
	/**
	 * アプリケーション初期化処理
	 * @throws Exception 処理されなかった例外
	 */
	public void init() throws Exception {
		Properties p = new Properties();
		// 具象インターフェースファクトリ
		p.setProperty(KoikeConstant.KEY_INTERFACE_FACTORY, "org.logical_paradox.koike.tools.isys.StubConcreteInterfaceFactory");
		// n-gram長
		p.setProperty(KoikeConstant.KEY_N_GRAM_TERM_LENGTH, "2");

		KoikeConfig config = new KoikeConfig(p);

		core = new StubSearchEngine(config);
	}
	/**
	 * テキストフィールドに何か入力された場合のイベントハンドラ
	 * @param jtf テキストフィールド
	 * @throws Exception 処理されなかった例外
	 */
	public void cbTextField(JTextField jtf) throws Exception {
		String[] searchWords = jtf.getText().trim().split(" ");		// 半角スペース区切りで検索語を分割

		// 検索条件を生成する
		SearchCondition condition = new SearchCondition();
		for(int i = 0; i < searchWords.length; i++) {
			condition.addChildNode(new Element(Element.TYPE_TERM, searchWords[i]));
		}
		// 1ページの表示件数
		condition.setDispnum(10);
		// 表示開始位置
		condition.setStartp(0);
		double begin = System.currentTimeMillis();
		SearchResult sr = core.search(condition);
		double fin = System.currentTimeMillis();

		double needtime = (fin - begin) / 1000.0;

		ResultSet[] results = null;
		if(sr == null) {
			results = new ResultSet[0];
		} else {
			results = sr.getResultSet();
		}
		jtf.setText("");

		cleanLogView();

		// 検索結果の表示
		if(results != null) {
			getWriter().println("検索時間:" + needtime);
			getWriter().println("該当: " + results.length);
			for(int i = 0; i < results.length; i++) {
				getWriter().println("結果(" + (i+1) + "): " + "[" + results[i].getDocumentTitle() + "]");
				getWriter().println("引用元: " + results[i].getUrl() + " (" + results[i].getNodeId() + ":" + results[i].getDocno() + ")");
				getWriter().println("------------------------------");		// 改行
				getWriter().println(results[i].getSummary());
				getWriter().println("------------------------------");		// 改行
			}
		} else {
			getWriter().println("一致しませんでした");
		}
	}
	/**
	 * アプリケーション終了処理
	 * @throws Exception 処理されなかった例外
	 */
	public void destroy() throws Exception {
		core = null;
	}
}

// end of FullTextSearchApplicationPack.java