blob: b1649e541c1069ff9fed069fc99fe1c0a87c3e54 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2000, 2015 IBM Corporation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* IBM Corporation - initial API and implementation
*******************************************************************************/
package org.eclipse.help.internal.webapp.servlet;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.List;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.eclipse.core.runtime.NullProgressMonitor;
import org.eclipse.help.internal.base.BaseHelpSystem;
import org.eclipse.help.internal.search.ISearchHitCollector;
import org.eclipse.help.internal.search.ISearchQuery;
import org.eclipse.help.internal.search.QueryTooComplexException;
import org.eclipse.help.internal.search.SearchHit;
import org.eclipse.help.internal.search.SearchQuery;
import org.eclipse.help.internal.webapp.data.UrlUtil;
import org.eclipse.help.internal.webapp.utils.SearchXMLGenerator;
/*
* Returns the search hits for the query provided in the phrase parameter.
*
* This is called on infocenters by client workbenches configured for remote
* help in order to retrieve search hits from the remote help server.
*/
public class SearchServlet extends HttpServlet {
private final class HitCollector implements ISearchHitCollector {
public Collection<SearchHit> results = new ArrayList<SearchHit>();
@Override
public void addHits(List<SearchHit> hits, String wordsSearched) {
if (results != null) {
results.addAll(hits);
}
}
@Override
public void addQTCException(QueryTooComplexException exception)
throws QueryTooComplexException {
searchException = exception;
}
}
private static final long serialVersionUID = 1L;
private static final String PARAMETER_PHRASE = "phrase"; //$NON-NLS-1$
private QueryTooComplexException searchException;
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
String response = processRequest(req, resp);
if ("".equals(response)) //$NON-NLS-1$
resp.sendError(400); // bad request; missing parameter
else
resp.getWriter().write(response);
}
protected String processRequest(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
BaseHelpSystem.checkMode();
HitCollector collector = new HitCollector();
String locale = UrlUtil.getLocale(req, resp);
req.setCharacterEncoding("UTF-8"); //$NON-NLS-1$
resp.setContentType("application/xml; charset=UTF-8"); //$NON-NLS-1$
String phrase = req.getParameter(PARAMETER_PHRASE);
if (phrase != null) {
ISearchQuery query = new SearchQuery(phrase, false, Collections.<String> emptyList(), locale);
collector.results.clear();
BaseHelpSystem.getSearchManager().search(query, collector, new NullProgressMonitor());
if (searchException == null) {
return serialize(collector.results);
}
}
return ""; //$NON-NLS-1$
}
public static String serialize(Collection<SearchHit> results) {
return SearchXMLGenerator.serialize(results);
}
}