/*
* Copyright 2002-2006 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.openuap.cms.search.action;
import java.io.PrintWriter;
import java.io.UnsupportedEncodingException;
import java.net.URLDecoder;
import java.net.URLEncoder;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.openuap.base.util.ControllerHelper;
import org.openuap.base.web.mvc.BaseController;
import org.openuap.cms.config.CMSConfig;
import org.openuap.cms.engine.profile.PublishProfileInfoHolder;
import org.openuap.cms.search.SearchCommand;
import org.openuap.cms.search.SearchEngine;
import org.openuap.cms.search.SearchResults;
import org.openuap.runtime.util.ObjectLocator;
import org.openuap.tpl.engine.TemplateContext;
import org.openuap.tpl.engine.TemplateEngine;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.web.servlet.ModelAndView;
/**
* <p>
* 通用内容搜索控制器,可以选择基于数据库搜索或者搜索引擎.
* </p>
*
* <p>
* $Id: SearchAction.java 4012 2011-01-24 11:05:06Z orangeforjava $
* </p>
*
*
* @author Joseph
* @version 1.0
*/
public class SearchAction extends BaseController implements InitializingBean {
private String jsonViewName;
private String defaultScreensPath;
/** 搜索引擎. */
private SearchEngine searchEngine;
/** 模板引擎. */
private TemplateEngine templateEngine;
/**
*
*/
public SearchAction() {
initDefaultViewName();
}
protected void initDefaultViewName() {
defaultScreensPath = "/plugin/cms/base/screens/search/";
jsonViewName = defaultScreensPath + "search_json.htm";
}
/**
* 执行搜索
*/
public ModelAndView doSearchJson(HttpServletRequest request,
HttpServletResponse response, ControllerHelper helper, Map model)
throws Exception {
ModelAndView mv = new ModelAndView(jsonViewName);
// 附加参数编码
String encoding = helper.getString("encoding", "UTF-8");
model.put("responseType", "text/javaScript");
model.put("noLayout", true);
// 模板参数
try {
// 返回页码
String page = helper.getString("page", "1");
// 每页记录数目
String pageNum = helper.getString("pageNum", "10");
//默认对这种方式的查询请求为false
boolean parseKeyword=helper.getBoolean("parseKeyword",false);
// 关键字
String tmp = request.getParameter("keyword");
if (tmp == null) {
tmp = "";
} else {
tmp = URLDecoder.decode(tmp, encoding);
}
// System.out.println("tmp="+tmp);
//
String keyword = tmp; //
//
// 传输的附加参数
String tmp2 = request.getParameter("extra");
if (tmp2 == null) {
tmp2 = "";
}
tmp2 = new String(tmp2.getBytes(), encoding);
String extra = tmp2;
if (extra == null) {
extra = "";
}
Map extraHash = new HashMap();
String[] extras = extra.split(",");
for (int i = 0; i < extras.length; i++) {
String extra_tmp = extras[i];
String[] extra_tmps = extra_tmp.split(":");
if (extra_tmps.length == 2) {
extraHash.put(extra_tmps[0], extra_tmps[1]);
}
}
// 搜索域
String fields = helper.getString("fields", "");
// 结点id
String nodeId = helper.getString("nodeId", "");
// 结点GUID
String nodeGUID = helper.getString("nodeGUID", "");
// 模型Id
String sTableId = helper.getString("tableId", "");
// 忽略结点
String ignore = helper.getString("ignore", "");
// 排序
String order = helper.getString("order", "");
// 条件
tmp = request.getParameter("where");
// 高亮
String highlights = helper.getString("highlights", "");
if (tmp == null) {
tmp = "";
} else {
tmp = URLDecoder.decode(tmp, encoding);
}
// 条件中过滤@(=)以及~(')
String where = tmp; //
String where2 = where.replaceAll("@", "=");
where2 = where2.replaceAll("~", "'");
//
int ipage = Integer.parseInt(page);
int ipageNum = Integer.parseInt(pageNum);
//
SearchCommand command = new SearchCommand(keyword, fields, nodeId,
nodeGUID, sTableId, ignore, order, where2, highlights,
ipage, pageNum, "");
command.setParseKeyword(parseKeyword);
//
SearchResults sr = searchEngine.doSearch(command);
//
String callback=request.getParameter("jsoncallback");
model.put("jsoncallback", callback);
// 搜索结果
model.put("rs", sr.getHits());
model.put("pb", sr.getPageBuilder());
model.put("searchTime", sr.getSearchTime());
//
model.put("keyword", URLEncoder.encode(keyword, "UTF-8"));
model.put("keyword2", keyword);
model.put("page", page);
model.put("pageNum", pageNum);
model.put("encoding", encoding);
model.put("fields", fields);
model.put("nodeId", nodeId);
model.put("nodeGUID", nodeGUID);
model.put("tableId", sTableId);
model.put("ignore", ignore);
model.put("order", order);
model.put("where", where);
model.put("extra", extra);
model.put("extraHash", extraHash);
//
model.put("result", "success");
return mv;
} catch (Exception e) {
e.printStackTrace();
model.put("result", "failed");
model.put("msg",e.getMessage());
return mv;
}
}
/**
* 支持灵活订制的全文检索
*/
public ModelAndView perform(HttpServletRequest request,
HttpServletResponse response, ControllerHelper helper, Map model)
throws Exception {
// 判断URL编码
String uriEncoding = CMSConfig.getInstance().getStringProperty(
"cms.uriEncoding", "UTF-8");
// 附加参数编码
String encoding = helper.getString("encoding", "UTF-8");
// 结果模板编码
String tplEncoding = helper.getString("tpl.encoding", "UTF-8");
// 设定模板编码
request.setAttribute("tpl.encoding", tplEncoding);
// TODO 输出编码控制
model.put("responseType", "text/html;charset=" + tplEncoding);
model.put("serverParse", "true");
// 模板参数
String tpl = helper.getString("tpl");
if (tpl != null) {
// ModelAndView mv = new ModelAndView(tpl, model);
//
String url = "";
//
// 返回页码
String page = helper.getString("page", "1");
// 每页记录数目
String pageNum = helper.getString("pageNum", "10");
// 关键字
String tmp = request.getParameter("keyword");
if (tmp == null) {
tmp = "";
} else {
tmp = URLDecoder.decode(tmp, uriEncoding);
}
// System.out.println("tmp="+tmp);
//
String keyword = tmp; //
//
// 传输的附加参数
String tmp2 = request.getParameter("extra");
if (tmp2 == null) {
tmp2 = "";
}
tmp2 = new String(tmp2.getBytes(), encoding);
String extra = tmp2;
if (extra == null) {
extra = "";
}
Map extraHash = new HashMap();
String[] extras = extra.split(",");
for (int i = 0; i < extras.length; i++) {
String extra_tmp = extras[i];
String[] extra_tmps = extra_tmp.split(":");
if (extra_tmps.length == 2) {
extraHash.put(extra_tmps[0], extra_tmps[1]);
}
}
// 搜索域
String fields = helper.getString("fields", "");
// 结点id
String nodeId = helper.getString("nodeId", "");
// 结点GUID
String nodeGUID = helper.getString("nodeGUID", "");
// 模型Id
String sTableId = helper.getString("tableId", "");
// 忽略结点
String ignore = helper.getString("ignore", "");
// 排序
String order = helper.getString("order", "");
// 条件
tmp = request.getParameter("where");
// 高亮
String highlights = helper.getString("highlights", "");
if (tmp == null) {
tmp = "";
} else {
tmp = URLDecoder.decode(tmp, uriEncoding);
}
// 条件中过滤@(=)以及~(')
String where = tmp; //
String where2 = where.replaceAll("@", "=");
where2 = where2.replaceAll("~", "'");
//
int ipage = Integer.parseInt(page);
int ipageNum = Integer.parseInt(pageNum);
//
SearchCommand command = new SearchCommand(keyword, fields, nodeId,
nodeGUID, sTableId, ignore, order, where2, highlights,
ipage, pageNum, "");
SearchResults sr = searchEngine.doSearch(command);
//
//
model.put("action", "News");
model.put("tpl", tpl);
// 搜索结果
model.put("rs", sr.getHits());
model.put("pb", sr.getPageBuilder());
model.put("searchTime", sr.getSearchTime());
//
model.put("keyword", URLEncoder.encode(keyword, "UTF-8"));
model.put("keyword2", keyword);
model.put("page", page);
model.put("pageNum", pageNum);
model.put("encoding", encoding);
model.put("tplEncoding", tplEncoding);
model.put("fields", fields);
model.put("nodeId", nodeId);
model.put("nodeGUID", nodeGUID);
model.put("tableId", sTableId);
model.put("ignore", ignore);
model.put("order", order);
model.put("where", where);
model.put("extra", extra);
model.put("extraHash", extraHash);
//
try {
if (PublishProfileInfoHolder.isEnableProfile()) {
//
PublishProfileInfoHolder.getProfile().setStartActionTime(
System.currentTimeMillis());
PublishProfileInfoHolder.getProfile().setActionName(
"search");
}
TemplateContext context = new TemplateContext();
// System.out.println("tpl="+tpl);
context.setTplName(tpl);
Map finalmodel = Collections.synchronizedMap(new HashMap());
//
finalmodel.put("__direct_out__", "yes");
finalmodel.putAll(model);
context.setModel(finalmodel);
List errors = new ArrayList();
getTemplateEngine().renderTemplate(context, errors);
String content = context.getTplContent();
response.setContentType("text/html;charset=" + tplEncoding);
//
PrintWriter pw = response.getWriter();
pw.print(content);
pw.flush();
pw.close();
return null;
} catch (Exception e) {
e.printStackTrace();
return null;
} finally {
if (PublishProfileInfoHolder.isEnableProfile()) {
PublishProfileInfoHolder.getProfile().setStartRenderTime(
System.currentTimeMillis());
PublishProfileInfoHolder.logProfile();
}
}
}
return null;
}
protected void setRequestCharacterEncoding(HttpServletRequest request) {
// no set chracter encoding
}
public void afterPropertiesSet() throws Exception {
}
public static void main(String[] args) {
String test = "%BB%A4%C0%ED";
try {
test = URLDecoder.decode(test, "GBK");
System.out.println("test=" + test);
} catch (UnsupportedEncodingException ex) {
ex.printStackTrace();
}
}
public void setSearchEngine(SearchEngine searchEngine) {
this.searchEngine = searchEngine;
}
public TemplateEngine getTemplateEngine() {
if (templateEngine == null) {
templateEngine = (TemplateEngine) ObjectLocator.lookup(
"templateEngine", "org.openuap.tpl.engine");
}
return templateEngine;
}
public void setTemplateEngine(TemplateEngine templateEngine) {
this.templateEngine = templateEngine;
}
}