/*
*
* Copyright SHMsoft, Inc.
*
* 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.freeeed.search.web.controller;
import java.util.ArrayList;
import java.util.List;
import javax.servlet.http.HttpSession;
import org.apache.log4j.Logger;
import org.freeeed.search.web.WebConstants;
import org.freeeed.search.web.configuration.Configuration;
import org.freeeed.search.web.model.solr.SolrResult;
import org.freeeed.search.web.session.SolrSessionObject;
import org.freeeed.search.web.solr.KeywordQuerySearch;
import org.freeeed.search.web.solr.QuerySearch;
import org.freeeed.search.web.solr.SolrSearchService;
import org.freeeed.search.web.solr.TagQuerySearch;
import org.freeeed.search.web.view.solr.ResultHighlight;
import org.freeeed.search.web.view.solr.SearchResult;
import org.freeeed.search.web.view.solr.SearchViewPreparer;
import org.freeeed.search.web.view.solr.YourSearchViewObject;
import org.springframework.web.servlet.ModelAndView;
/**
*
* Class SearchController.
*
* Implements the search logic.
*
* @author ilazarov
*
*/
public class SearchController extends SecureController {
private static final Logger log = Logger.getLogger(SearchController.class);
private Configuration configuration;
private SolrSearchService solrSearchService;
private SearchViewPreparer searchViewPreparer;
private ResultHighlight resultHighlight;
@Override
public ModelAndView execute() {
String action = (String) valueStack.get("action");
log.debug("Search action received: " + action);
HttpSession session = this.request.getSession(true);
SolrSessionObject solrSession = (SolrSessionObject)
session.getAttribute(WebConstants.WEB_SESSION_SOLR_OBJECT);
if (solrSession == null) {
solrSession = new SolrSessionObject();
session.setAttribute(WebConstants.WEB_SESSION_SOLR_OBJECT, solrSession);
}
int page = 1;
int rows = configuration.getNumberOfRows();
int from = 0;
if ("search".equals(action)) {
//setup the query
String search = (String) valueStack.get("query");
if (search != null && search.length() > 0) {
KeywordQuerySearch qs = new KeywordQuerySearch(search, solrSearchService, from, rows);
solrSession.addQuery(qs);
}
} else if ("tagsearch".equals(action)) {
String tag = (String) valueStack.get("tag");
if (tag != null && tag.length() > 0) {
TagQuerySearch qs = new TagQuerySearch(tag);
solrSession.addQuery(qs);
}
} else if ("remove".equals(action)) {
String idStr = (String) valueStack.get("id");
try {
int id = Integer.parseInt(idStr);
solrSession.removeById(id);
} catch (Exception e) {
}
} else if ("removeall".equals(action)) {
solrSession.removeAll();
} else if ("changepage".equals(action)) {
String pageStr = (String) valueStack.get("page");
if (pageStr != null) {
try {
page = Integer.parseInt(pageStr);
if (page < 1) {
page = 1;
}
if (solrSession != null) {
if (page > solrSession.getTotalPage()) {
page = solrSession.getTotalPage();
}
}
} catch (Exception e) {
}
from = (page - 1) * configuration.getNumberOfRows();
}
}
List<YourSearchViewObject> yourSearches = new ArrayList<YourSearchViewObject>();
List<QuerySearch> searches = solrSession.getQueries();
for (int i = 0; i < searches.size(); i++) {
QuerySearch querySearch = searches.get(i);
querySearch.adjust(from, rows);
YourSearchViewObject so = new YourSearchViewObject();
so.setId(i + 1);
so.setName(querySearch.getDisplay());
so.setKeywords(querySearch.getSearchKeywords());
yourSearches.add(so);
}
if (searches.size() > 0) {
String search = solrSession.buildSearchQuery();
SolrResult result = solrSearchService.search(search, from, rows);
//if solr returns correct result
if (result != null) {
//prepare the view data
SearchResult resultView = searchViewPreparer.prepareView(result);
resultHighlight.highlight(resultView, yourSearches);
valueStack.put("result", resultView);
valueStack.put("searched", yourSearches);
solrSession.setCurrentPage(page);
int total = result.getTotalSize() / configuration.getNumberOfRows();
if (result.getTotalSize() % configuration.getNumberOfRows() > 0) {
total ++;
}
solrSession.setTotalPage(total);
solrSession.setTotalDocuments(result.getTotalSize());
setupPagination();
}
}
return new ModelAndView(WebConstants.SEARCH_AJAX_PAGE);
}
private void setupPagination() {
SolrSessionObject session = (SolrSessionObject)
this.request.getSession(true).getAttribute("solrSession");
valueStack.put("showPagination", session.getTotalPage() > 1);
valueStack.put("currentPage", session.getCurrentPage());
valueStack.put("showPrev", session.getCurrentPage() > 1);
valueStack.put("showNext", session.getCurrentPage() < session.getTotalPage());
valueStack.put("searchPerformed", true);
}
public void setConfiguration(Configuration configuration) {
this.configuration = configuration;
}
public void setSolrSearchService(SolrSearchService solrSearchService) {
this.solrSearchService = solrSearchService;
}
public void setSearchViewPreparer(SearchViewPreparer searchViewPreparer) {
this.searchViewPreparer = searchViewPreparer;
}
public void setResultHighlight(ResultHighlight resultHighlight) {
this.resultHighlight = resultHighlight;
}
}