/** * 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.regex.Matcher; import java.util.regex.Pattern; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpSession; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import edu.unc.lib.dl.acl.util.AccessGroupSet; import edu.unc.lib.dl.acl.util.GroupsThreadStore; import edu.unc.lib.dl.search.solr.exception.InvalidHierarchicalFacetException; import edu.unc.lib.dl.search.solr.model.SearchState; 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.service.SearchActionService; import edu.unc.lib.dl.search.solr.service.SearchStateFactory; import edu.unc.lib.dl.search.solr.util.SearchSettings; import edu.unc.lib.dl.search.solr.model.HierarchicalBrowseRequest; import edu.unc.lib.dl.ui.service.SolrQueryLayerService; /** * Abstract base class for controllers which interact with solr services. * @author bbpennel */ public abstract class AbstractSolrSearchController { private final Logger LOG = LoggerFactory.getLogger(AbstractSolrSearchController.class); @Autowired(required=true) protected SolrQueryLayerService queryLayer; //@Autowired(required=true) //protected SearchStateValidator briefSearchRequestValidator; @Autowired(required=true) protected SearchActionService searchActionService; @Autowired protected SearchSettings searchSettings; @Autowired protected SearchStateFactory searchStateFactory; protected SearchRequest generateSearchRequest(HttpServletRequest request){ return this.generateSearchRequest(request, null, new SearchRequest()); } protected SearchRequest generateSearchRequest(HttpServletRequest request, SearchState searchState){ return this.generateSearchRequest(request, searchState, new SearchRequest()); } /** * Builds a search request model object from the provided http servlet request and the provided * search state. If the search state is null, then it will attempt to retrieve it from first * the session and if that fails, then from current GET parameters. Validates the search state * and applies any actions provided as well. * @param request * @return */ protected SearchRequest generateSearchRequest(HttpServletRequest request, SearchState searchState, SearchRequest searchRequest){ //Get user access groups. Fill this in later, for now just set to public HttpSession session = request.getSession(); //Get the access group list AccessGroupSet accessGroups = GroupsThreadStore.getGroups(); searchRequest.setAccessGroups(accessGroups); //Retrieve the last search state if (searchState == null){ searchState = (SearchState)session.getAttribute("searchState"); if (searchState == null){ if (searchRequest != null && searchRequest instanceof HierarchicalBrowseRequest){ searchState = searchStateFactory.createHierarchicalBrowseSearchState(request.getParameterMap()); } else { searchState = searchStateFactory.createSearchState(request.getParameterMap()); } } else { session.removeAttribute("searchState"); } } //Perform actions on search state try { searchActionService.executeActions(searchState, request.getParameterMap()); } catch (InvalidHierarchicalFacetException e){ LOG.debug("An invalid facet was provided: " + request.getQueryString(), e); } //Store the search state into the search request searchRequest.setSearchState(searchState); return searchRequest; } private Pattern oldFacetPath = Pattern.compile("(setFacet:)?path[,:]\"?\\d+,(uuid:[a-f0-9\\-]+)(!\\d+)?"); /** * Extracts and sets paths which follow the previous syntax for backwards compatibility. * Pulls from either the action or facet parameter, in that order * * @param request * @param searchRequest */ protected boolean extractOldPathSyntax(HttpServletRequest request, SearchRequest searchRequest) { String action = request.getParameter("action"); boolean added = this.getOldPath(action, searchRequest); if (added) return true; String facet = request.getParameter("facets"); return this.getOldPath(facet, searchRequest); } protected boolean getOldPath(String parameter, SearchRequest searchRequest) { if (parameter != null) { Matcher matches = oldFacetPath.matcher(parameter); if (matches.find()) { searchRequest.setRootPid(matches.group(2)); searchRequest.setApplyCutoffs(matches.group(3) != null); return true; } } return false; } protected SearchResultResponse getSearchResults(SearchRequest searchRequest){ return queryLayer.getSearchResults(searchRequest); } public SearchActionService getSearchActionService() { return searchActionService; } public void setSearchActionService(SearchActionService searchActionService) { this.searchActionService = searchActionService; } public SolrQueryLayerService getQueryLayer() { return queryLayer; } public void setQueryLayer(SolrQueryLayerService queryLayer) { this.queryLayer = queryLayer; } public void setSearchStateFactory(SearchStateFactory searchStateFactory) { this.searchStateFactory = searchStateFactory; } }