package net.jforum.controllers;
import net.jforum.actions.helpers.Actions;
import net.jforum.actions.helpers.Domain;
import net.jforum.entities.UserSession;
import net.jforum.entities.util.Pagination;
import net.jforum.entities.util.SearchParams;
import net.jforum.entities.util.SearchResult;
import net.jforum.repository.CategoryRepository;
import net.jforum.repository.SearchRepository;
import net.jforum.util.ConfigKeys;
import net.jforum.util.JForumConfig;
import org.apache.commons.lang.StringUtils;
import org.apache.lucene.queryParser.ParseException;
import br.com.caelum.vraptor.Path;
import br.com.caelum.vraptor.Resource;
import br.com.caelum.vraptor.Result;
/**
* @author Filipe Sabella
* @author Rafael Steil
*/
@Resource
@Path(Domain.SEARCH)
public class SearchController {
private JForumConfig config;
private SearchRepository searchRepository;
private CategoryRepository categoryRepository;
private UserSession userSession;
private final Result result;
public SearchController(CategoryRepository categoryRepository,
JForumConfig config, SearchRepository searchRepository,
UserSession userSession, Result result) {
this.categoryRepository = categoryRepository;
this.config = config;
this.searchRepository = searchRepository;
this.userSession = userSession;
this.result = result;
}
/**
* Shows the page to start a new search
*/
public void filters() {
this.result.include("categories",
this.categoryRepository.getAllCategories());
}
public void execute(SearchParams params) {
if (StringUtils.isEmpty(params.getQuery())
&& StringUtils.isEmpty(params.getUser())) {
this.result.redirectTo(Actions.FILTERS);
} else {
try {
params.setMaxResults(this.config
.getInt(ConfigKeys.TOPICS_PER_PAGE));
SearchResult result = this.searchRepository.search(params)
.filter(this.userSession.getRoleManager());
Pagination pagination = new Pagination(this.config,
params.getStart()).forSearch(result.getTotalRecords());
this.result.include("results", result.getResults());
this.result.include("searchParams", params);
this.result.include("pagination", pagination);
this.result.include("categories",
this.categoryRepository.getAllCategories());
} catch (ParseException e) {
this.result.include("parseError", true);
this.result.include("parseErrorMessage", e.toString());
}
}
}
}