/**
 * LOGICAL-PARADOX.ORG
 * Copyright (C)2004 satoshi akabane(akabane@logical-paradox.org)
 *
 */
package org.logical_paradox.phalanx.servlet;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.logical_paradox.phalanx.DocumentProcessor;

/**
 * ユニバーサル検索サービスのフロントエンドたるサーブレット
 * XMLドキュメントをPOSTで受信して、検索サーバーに検索要求を発行し、検索結果をXMLに変換して戻します。<br>
 * サーブレットの初期化パラメータとして、次の値が指定できます。<br>
 * <li><b>enable_get_method</b>:&nbsp;&nbsp;&nbsp;GETによるXMLデータ送信を許可します。</li>
 * <li><b>dsruri</b>:&nbsp;&nbsp;&nbsp;検索サーバーを探す際の起点となる、分散ネットワーク上のアクセスポイント(DSR)</li>
 * <li><b>encoding</b>:&nbsp;&nbsp;&nbsp;検索結果の出力エンコーディング</li>
 * <li><b>config.dir</b></li>:&nbsp;&nbsp;&nbsp;コンフィグファイルを格納しているディレクトリ(コンテキストパス)</li>
 * @author satoshi akabane@logical-paradox.org
 * @version $Revision: 1.9 $
 */
public class SearchServlet extends HttpServlet {
	/** シリアルバージョンUID */
	private static final long serialVersionUID = 7049247806827014894L;

	public static final String KEY_ENABLE_GET_METHOD = "enable_get_method";
	public static final String KEY_DSRURI = "dsruri";
	public static final String KEY_XML_ENCODING = "encoding";
	public static final String KEY_CONFIG_DIR = "config.dir";
	public static final String QUERY_XML_DOCUMENT = "req";
	public static final String DEFAULT_XML_ENCODING = "utf-8";

	/**
	 * GET要求のディスパッチャ
	 * @param arg0 リクエスト
	 * @param arg1 レスポンス
	 * @throws ServletException サーブレットの実行に失敗
	 * @throws IOException レスポンスの出力に失敗
	 */
	protected void doGet(HttpServletRequest arg0, HttpServletResponse arg1)
		throws ServletException, IOException {

		String enableGetMethod = getInitParameter(KEY_ENABLE_GET_METHOD);
		if("true".equals(enableGetMethod)) {
			// GETによるアクセスが許可されている場合は実行
			execute(arg0, arg1);
		} else {
			// GETが禁止されている場合はエラーとする
			throw new ServletException("access using get method is not recognized on current run mode.");
		}
	}

	/**
	 * POST要求のディスパッチャ
	 * @param arg0 リクエスト
	 * @param arg1 レスポンス
	 * @throws ServletException サーブレットの実行に失敗
	 * @throws IOException レスポンスの出力に失敗
	 */
	protected void doPost(HttpServletRequest arg0, HttpServletResponse arg1)
		throws ServletException, IOException {
		execute(arg0, arg1);
	}
	/**
	 * 要求解析の実行
	 * @param request リクエスト
	 * @param response レスポンス
	 * @throws ServletException サーブレットの実行に失敗
	 * @throws IOException レスポンスの出力に失敗
	 */
	protected void execute(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		String document = request.getParameter(QUERY_XML_DOCUMENT);
		if(document == null || document.trim().length() == 0) {
			// XMLドキュメントが送信されてこなかった場合
			throw new ServletException("xml document is required.");
		}

		String dsruri = getInitParameter(KEY_DSRURI);
		if(dsruri == null || dsruri.trim().length() == 0) {
			throw new ServletException("servlet initial parameter 'dsruri' is not specified.");
		}
		String xmlEncoding = getInitParameter(KEY_XML_ENCODING);
		if(xmlEncoding == null || xmlEncoding.trim().length() == 0) {
			xmlEncoding = DEFAULT_XML_ENCODING;
		}
		String configDir = getInitParameter(KEY_CONFIG_DIR);
		if(configDir == null || configDir.trim().length() == 0) {
			configDir = ".";
		} else {
			// コンテキストパスをリアルパスに変換する
			configDir = getServletContext().getRealPath(configDir);
		}
		try {
			// 検索処理
			String result = DocumentProcessor.newInstance(dsruri, xmlEncoding, configDir).search(document);
			// 検索結果を返す
			response.setContentType("text/xml; charset=" + xmlEncoding);
			response.setCharacterEncoding(xmlEncoding);
			// XMLの出力
			PrintWriter pw = response.getWriter();
			pw.println(result);
			pw.flush();
		} catch (Exception e) {
			// 検索障害
			response.setContentType("text/plain; charset=" + xmlEncoding);
			response.setCharacterEncoding(xmlEncoding);
			e.printStackTrace(response.getWriter());
		}
	}
}
