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

import java.io.ByteArrayOutputStream;
import java.io.InputStream;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
import org.apache.struts.util.MessageResources;
import org.logical_paradox.common.util.StringUtils;
import org.logical_paradox.kinako.constant.ApConstant;
import org.logical_paradox.kinako.form.SearchForm;
import org.logical_paradox.kinako.logic.KinakoSearchLogic;
import org.logical_paradox.kinako.logic.SearchResultTranslator;
import org.logical_paradox.kinako.object.SearchCondition;

/**
 * 検索アクション
 * キーワード検索を実行します
 * @author satoshi akabane@logical-paradox.org
 * @version $Revision: 1.8 $
 */
public class SearchAction extends KinakoBaseAction {
	/** ロガー */
	private static final Log log = LogFactory.getLog(SearchAction.class);

	/**
	 * キーワード検索を実行するアクション
	 * 画面から入力されたキーワードは，検索サーバーに送信される．<BR>
	 * 検索結果は検索サーバーからXMLで受信する．
	 * 
	 * @param form アクションフォーム
	 * @param mapping アクションマッピング
	 * @param resource メッセージリソース
	 * @return フォワード
	 */
	public ActionForward executeLogic(ActionForm form, ActionMapping mapping, MessageResources resource) throws Exception {
		SearchForm searchForm = (SearchForm)form;

		String xmlEncoding = resource.getMessage("system.encoding.xml");
		String urlEncoding = resource.getMessage("system.encoding.url");
		String pageEncoding = resource.getMessage("system.encoding.page");
		String xslFilename = resource.getMessage("system.path.xsl.result");

		if(StringUtils.isEmpty(xmlEncoding)) {
			xmlEncoding = ApConstant.PHALANX_DEFAULT_XML_ENCODING;
		}
		if(StringUtils.isEmpty(urlEncoding)) {
			urlEncoding = ApConstant.KINAKO_DEFAULT_URL_ENCODING;
		}
		if(StringUtils.isEmpty(pageEncoding)) {
			pageEncoding = ApConstant.KINAKO_DEFAULT_PAGE_ENCODING;
		}
		String url = resource.getMessage("phalanx.apserver.url");

		// 開始位置・終了位置が指定されていない場合はデフォルト値を設定
		if(searchForm.getStartIndex() == 0 && searchForm.getNum() == 0) {
			searchForm.setStartIndex(1);
			searchForm.setNum(Integer.parseInt(resource.getMessage("system.default.page_size")));
		}
		// 検索要求の送信
		SearchCondition condition = searchForm.bindToSearchCondition();
		InputStream istream = new KinakoSearchLogic(xmlEncoding).search(url, condition, urlEncoding);

		// XML→HTML変換
		// 返ってきた検索結果をHTMLに変換する
		SearchResultTranslator translator = SearchResultTranslator.getInstance();
		ByteArrayOutputStream out = new ByteArrayOutputStream();

		// 変換
		int hits = translator.output(out, istream, xslFilename, xmlEncoding, condition);

		istream.close();

		// 受信した検索結果をとりあえずログに出力する
		log.info("検索結果:\n--------------------\n" + out.toString());

		// HTMLを保存する
		searchForm.setResult(out.toString());
		searchForm.setHits(hits);

		return mapping.findForward(ApConstant.FORWARD_SUCCESS);
	}
}
