/**
* Copyright 2008 The University of North Carolina at Chapel Hill
*
* 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 edu.unc.lib.dl.ui.controller;
import java.util.Arrays;
import javax.servlet.http.HttpServletRequest;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import edu.unc.lib.dl.fedora.PID;
import edu.unc.lib.dl.search.solr.model.CutoffFacet;
import edu.unc.lib.dl.search.solr.model.SearchRequest;
import edu.unc.lib.dl.search.solr.model.SearchResultResponse;
import edu.unc.lib.dl.search.solr.model.SearchState;
import edu.unc.lib.dl.search.solr.util.SearchFieldKeys;
import edu.unc.lib.dl.search.solr.util.SearchStateUtil;
import edu.unc.lib.dl.util.ResourceType;
/**
* Controller which interprets the provided search state, from either the last search state in the session or from GET
* parameters, as well as actions performed on the state, and retrieves search results using it.
*
* @author bbpennel
*/
@Controller
public class SearchActionController extends AbstractSolrSearchController {
@Autowired(required=true)
protected PID collectionsPid;
private static final Logger LOG = LoggerFactory.getLogger(SearchActionController.class);
@RequestMapping("/search/{pid}")
public String search(@PathVariable("pid") String pid, Model model, HttpServletRequest request) {
SearchRequest searchRequest = generateSearchRequest(request);
searchRequest.setRootPid(pid);
searchRequest.setApplyCutoffs(false);
model.addAttribute("queryMethod", "search");
return search(searchRequest, model, request);
}
@RequestMapping("/search")
public String search(Model model, HttpServletRequest request) {
SearchRequest searchRequest = generateSearchRequest(request);
// Backwards compability with the previous search url
if (!extractOldPathSyntax(request, searchRequest)) {
searchRequest.setApplyCutoffs(false);
}
model.addAttribute("queryMethod", "search");
return search(searchRequest, model, request);
}
private String search(SearchRequest searchRequest, Model model, HttpServletRequest request) {
SearchResultResponse resultResponse = doSearch(searchRequest, model, request);
model.addAttribute("resultType", "searchResults");
model.addAttribute("pageSubtitle", "Search Results");
return "searchResults";
}
@RequestMapping("/list/{pid}")
public String list(@PathVariable("pid") String pid, Model model, HttpServletRequest request) {
SearchRequest searchRequest = generateSearchRequest(request);
searchRequest.setRootPid(pid);
searchRequest.setApplyCutoffs(true);
model.addAttribute("queryMethod", "list");
model.addAttribute("facetQueryMethod", "search");
return search(searchRequest, model, request);
}
@RequestMapping("/list")
public String list(Model model, HttpServletRequest request) {
SearchRequest searchRequest = generateSearchRequest(request);
searchRequest.setRootPid(collectionsPid.getPid());
searchRequest.setApplyCutoffs(true);
model.addAttribute("queryMethod", "list");
model.addAttribute("facetQueryMethod", "search");
return search(searchRequest, model, request);
}
@RequestMapping("/listContents/{pid}")
public String listContents(@PathVariable("pid") String pid, Model model, HttpServletRequest request) {
SearchRequest searchRequest = generateSearchRequest(request);
searchRequest.getSearchState().setResourceTypes(
Arrays.asList(ResourceType.Aggregate.name(), ResourceType.File.name()));
searchRequest.setRootPid(pid);
searchRequest.setApplyCutoffs(false);
searchRequest.getSearchState().setRollup(true);
model.addAttribute("queryMethod", "listContents");
return search(searchRequest, model, request);
}
@RequestMapping("/listContents")
public String listContents(Model model, HttpServletRequest request) {
return listContents(collectionsPid.getPid(), model, request);
}
@RequestMapping("/collections")
public String browseCollections(Model model, HttpServletRequest request) {
SearchRequest searchRequest = generateSearchRequest(request);
CutoffFacet cutoff = new CutoffFacet(SearchFieldKeys.ANCESTOR_PATH.name(), "1,*!2");
searchRequest.getSearchState().getFacets().put(SearchFieldKeys.ANCESTOR_PATH.name(), cutoff);
searchRequest.setApplyCutoffs(true);
SearchState searchState = searchRequest.getSearchState();
searchState.setResourceTypes(Arrays.asList(searchSettings.resourceTypeCollection));
searchState.setRowsPerPage(searchSettings.defaultCollectionsPerPage);
searchState.setFacetsToRetrieve(searchSettings.collectionBrowseFacetNames);
SearchResultResponse result = doSearch(searchRequest, model, request);
result.setSelectedContainer(null);
model.addAttribute("queryMethod", "collections");
model.addAttribute("facetQueryMethod", "search");
model.addAttribute("menuId", "browse");
model.addAttribute("resultType", "collectionBrowse");
model.addAttribute("pageSubtitle", "Browse Collections");
return "collectionBrowse";
}
protected SearchResultResponse doSearch(SearchRequest searchRequest, Model model, HttpServletRequest request) {
LOG.debug("In handle search actions");
searchRequest.setRetrieveFacets(true);
// Request object for the search
SearchState searchState = searchRequest.getSearchState();
SearchResultResponse resultResponse = queryLayer.performSearch(searchRequest);
if (resultResponse != null) {
if (searchRequest.isRetrieveFacets()) {
SearchRequest facetRequest = new SearchRequest(searchState, true);
facetRequest.setApplyCutoffs(false);
if (resultResponse.getSelectedContainer() != null) {
SearchState facetState = (SearchState) searchState.clone();
facetState.getFacets().put(SearchFieldKeys.ANCESTOR_PATH.name(), resultResponse.getSelectedContainer().getPath());
facetRequest.setSearchState(facetState);
}
// Retrieve the facet result set
SearchResultResponse resultResponseFacets = queryLayer.getFacetList(facetRequest);
resultResponse.setFacetFields(resultResponseFacets.getFacetFields());
}
queryLayer.populateBreadcrumbs(searchRequest, resultResponse);
}
model.addAttribute("searchStateUrl", SearchStateUtil.generateStateParameterString(searchState));
model.addAttribute("searchQueryUrl", SearchStateUtil.generateSearchParameterString(searchState));
model.addAttribute("userAccessGroups", searchRequest.getAccessGroups());
model.addAttribute("resultResponse", resultResponse);
return resultResponse;
}
public void setCollectionsPid(PID collectionsPid) {
this.collectionsPid = collectionsPid;
}
}