*
* @see ch.entwine.weblounge.dispatcher.RequestHandler#service(ch.entwine.weblounge.common.request.WebloungeRequest,
* ch.entwine.weblounge.common.request.WebloungeResponse)
*/
public boolean service(WebloungeRequest request, WebloungeResponse response) {
Site site = request.getSite();
WebUrl url = request.getUrl();
RequestFlavor flavor = request.getFlavor();
String path = url.getPath();
if (flavor == null || flavor.equals(ANY))
flavor = RequestFlavor.HTML;
// Is this request intended for the search handler?
if (!path.startsWith(URI_PREFIX)) {
logger.debug("Skipping request for {}, request path does not start with {}", URI_PREFIX);
return false;
}
// Check the request flavor
if (!HTML.equals(flavor)) {
logger.debug("Skipping request for {}, flavor {} is not supported", path, request.getFlavor());
return false;
}
// Check the request method. Only GET is supported right now.
String requestMethod = request.getMethod().toUpperCase();
if ("OPTIONS".equals(requestMethod)) {
String verbs = "OPTIONS,GET";
logger.trace("Answering options request to {} with {}", url, verbs);
response.setHeader("Allow", verbs);
response.setContentLength(0);
return true;
} else if (!"GET".equals(requestMethod)) {
logger.debug("Search request handler does not support {} requests", requestMethod);
DispatchUtils.sendError(HttpServletResponse.SC_METHOD_NOT_ALLOWED, request, response);
return true;
}
int limit = 0;
int offset = 0;
String queryString = null;
// Read the parameters
try {
limit = RequestUtils.getIntegerParameterWithDefault(request, PARAM_LIMIT, 0);
offset = RequestUtils.getIntegerParameterWithDefault(request, PARAM_OFFSET, 0);
queryString = RequestUtils.getRequiredParameter(request, PARAM_QUERY);
} catch (IllegalStateException e) {
logger.debug("Search request handler processing failed: {}", e.getMessage());
DispatchUtils.sendBadRequest(request, response);
return true;
}
// Load the content repository
ContentRepository repository = site.getContentRepository();
if (repository == null) {
DispatchUtils.sendServiceUnavailable(request, response);
return true;
}
// Create the search expression and the query
SearchQuery q = new SearchQueryImpl(site);
q.withText(true, queryString);
q.withVersion(Resource.LIVE);
q.withRececyPriority();
q.withOffset(offset);
q.withLimit(limit);
q.withTypes(Page.TYPE);
// Return the result
SearchResult result = null;
try {
result = repository.find(q);
} catch (ContentRepositoryException e) {
logger.error("Error trying to access the content repository", e);
throw new WebApplicationException(e);
}
// Load the target page used to render the search result
Page page = null;
try {
page = getTargetPage(request);
request.setAttribute(WebloungeRequest.PAGE, page);
} catch (ContentRepositoryException e) {
logger.error("Error loading target page at {}", url);
DispatchUtils.sendInternalError(request, response);
return true;
}
// Get hold of the page template
PageTemplate template = null;
try {
template = getTargetTemplate(page, request);
if (template == null)
template = site.getDefaultTemplate();
} catch (IllegalStateException e) {
logger.warn(e.getMessage());
DispatchUtils.sendInternalError(request, response);
return true;
}