/*
* Copyright 2005-2008 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.admin;
import java.net.URLDecoder;
import java.net.URLEncoder;
import java.util.HashMap;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.openuap.base.util.ControllerHelper;
import org.openuap.base.util.StringUtil;
import org.openuap.cms.cm.manager.ContentTableManager;
import org.openuap.cms.cm.model.ContentTable;
import org.openuap.cms.core.action.AdminAction;
import org.openuap.cms.node.manager.NodeManager;
import org.openuap.cms.search.SearchCommand;
import org.openuap.cms.search.SearchEngine;
import org.openuap.cms.search.SearchResults;
import org.springframework.web.servlet.ModelAndView;
/**
* <p>
* 后台全文检索控制器. <br/>
* 仅供后台管理内容使用,不提供给前台调用.
* </p>
* <p>
* $Id: SearchAction.java 4026 2011-03-22 14:58:42Z orangeforjava $
* </p>
*
* @author Joseph
* @version 4.0
*/
public class SearchAction extends AdminAction {
private String defaultViewName;
private String defaultScreensPath;
/** 内容模型管理. */
private ContentTableManager contentTableManager;
/** 搜索引擎. */
private SearchEngine searchEngine;
/** */
private NodeManager nodeManager;
public SearchAction() {
initDefaultViewName();
}
protected void initDefaultViewName() {
defaultScreensPath = "/plugin/cms/base/screens/search/";
defaultViewName = defaultScreensPath + "fulltext_search.html";
}
@SuppressWarnings("unchecked")
public ModelAndView perform(HttpServletRequest request,
HttpServletResponse response, ControllerHelper helper, Map model)
throws Exception {
String tid = helper.getString("tid", "");
String nodeId = helper.getString("nodeId", "");
ModelAndView mv = new ModelAndView(defaultViewName);
if (StringUtil.hasText(tid)) {
ContentTable ct = contentTableManager
.getContentTableFromCache(new Long(tid));
model.put("nodeManager", nodeManager);
if (ct != null) {
model.put("ct", ct);
model.put("tid", tid);
if (StringUtil.hasText(nodeId)) {
model.put("nodeId", new Long(nodeId));
} else {
model.put("nodeId", -1);
}
return mv;
} else {
this.errorPage(request, response, helper,
"contentTable_not_exists", model);
}
} else {
this.errorPage(request, response, helper, "tid_not_exists", model);
}
return null;
}
/**
* 执行检索
*
* @param request
* @param response
* @param helper
* @param model
* @return
* @throws Exception
*/
public ModelAndView doSearch(HttpServletRequest request,
HttpServletResponse response, ControllerHelper helper, Map model)
throws Exception {
ModelAndView mv = new ModelAndView(defaultViewName);
try {
// 模型Id
String tid = helper.getString("tid", "");
ContentTable ct = contentTableManager
.getContentTableFromCache(new Long(tid));
model.put("nodeManager", nodeManager);
model.put("ct", ct);
String encoding = helper.getString("encoding", "UTF-8");
// 返回页码
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, 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", "");
// 忽略结点
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, tid, ignore, order, where2, highlights, ipage,
pageNum, "");
SearchResults sr = searchEngine.doSearch(command);
model.put("ac", "search");
model.put("rs", sr.getHits());
model.put("pb", sr.getPageBuilder());
model.put("searchTime", sr.getSearchTime());
//
model.put("keyword", URLDecoder.decode(keyword, "UTF-8"));
model.put("keyword2", keyword);
model.put("page", page);
model.put("pageNum", pageNum);
model.put("encoding", encoding);
model.put("fields", fields);
if (StringUtil.hasText(nodeId)) {
model.put("nodeId", new Long(nodeId));
} else {
model.put("nodeId", -1);
}
model.put("nodeGUID", nodeGUID);
model.put("tid", tid);
model.put("ignore", ignore);
model.put("order", order);
model.put("where", where);
model.put("extra", extra);
model.put("extraHash", extraHash);
model.put("result", "success");
} catch (Exception e) {
e.printStackTrace();
model.put("result", "failed");
model.put("msg", e.getMessage());
}
return mv;
}
public void setDefaultViewName(String defaultViewName) {
this.defaultViewName = defaultViewName;
}
public void setDefaultScreensPath(String defaultScreensPath) {
this.defaultScreensPath = defaultScreensPath;
}
public void setContentTableManager(ContentTableManager contentTableManager) {
this.contentTableManager = contentTableManager;
}
public void setSearchEngine(SearchEngine searchEngine) {
this.searchEngine = searchEngine;
}
public void setNodeManager(NodeManager nodeManager) {
this.nodeManager = nodeManager;
}
}