package com.constellio.app.api.search;
import java.io.IOException;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.solr.client.solrj.response.QueryResponse;
import org.apache.solr.common.params.ModifiableSolrParams;
import org.apache.solr.request.LocalSolrQueryRequest;
import org.apache.solr.response.JSONResponseWriter;
import org.apache.solr.response.SolrQueryResponse;
import org.apache.solr.response.XMLResponseWriter;
import org.apache.solr.servlet.SolrRequestParsers;
import com.constellio.app.api.HttpServletRequestAuthenticator;
import com.constellio.app.services.factories.ConstellioFactories;
import com.constellio.model.entities.security.global.UserCredential;
import com.constellio.model.services.factories.ModelLayerFactory;
import com.constellio.model.services.search.FreeTextSearchServices;
import com.constellio.model.services.search.query.logical.FreeTextQuery;
public class SearchWebService extends HttpServlet {
private static synchronized ConstellioFactories getConstellioFactories() {
return ConstellioFactories.getInstance();
}
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
HttpServletRequestAuthenticator authenticator = new HttpServletRequestAuthenticator(modelLayerFactory());
UserCredential user = authenticator.authenticate(request);
if (user == null) {
throw new RuntimeException("Invalid serviceKey/token");
}
boolean searchingInEvents = "true".equals(request.getParameter("searchEvents"));
ModifiableSolrParams solrParams = new ModifiableSolrParams(
SolrRequestParsers.parseQueryString(request.getQueryString()));
solrParams.remove("searchEvents");
solrParams.remove(HttpServletRequestAuthenticator.USER_SERVICE_KEY);
solrParams.remove(HttpServletRequestAuthenticator.USER_TOKEN);
solrParams.add("fq", "-type_s:index");
QueryResponse queryResponse;
if (searchingInEvents) {
if (!user.isSystemAdmin()) {
throw new RuntimeException("You need system admin privileges");
}
queryResponse = getEventQueryResponse(solrParams);
} else {
queryResponse = getQueryResponse(solrParams, user);
}
writeResponse(response, solrParams, queryResponse);
}
private ModelLayerFactory modelLayerFactory() {
return ConstellioFactories.getInstance().getModelLayerFactory();
}
private QueryResponse getQueryResponse(ModifiableSolrParams solrParams, UserCredential user) {
ModelLayerFactory modelLayerFactory = getConstellioFactories().getModelLayerFactory();
FreeTextSearchServices freeTextSearchServices = modelLayerFactory.newFreeTextSearchServices();
return freeTextSearchServices.search(new FreeTextQuery(solrParams).filteredByUser(user));
}
private QueryResponse getEventQueryResponse(ModifiableSolrParams solrParams) {
ModelLayerFactory modelLayerFactory = getConstellioFactories().getModelLayerFactory();
FreeTextSearchServices freeTextSearchServices = modelLayerFactory.newFreeTextSearchServices();
return freeTextSearchServices.search(new FreeTextQuery(solrParams).searchEvents());
}
private void writeResponse(HttpServletResponse response, ModifiableSolrParams solrParams, QueryResponse queryResponse) {
response.setContentType("application/xml; charset=UTF-8");
OutputStream outputStream;
try {
outputStream = response.getOutputStream();
} catch (IOException e) {
throw new RuntimeException(e);
}
SolrQueryResponse sResponse = new SolrQueryResponse();
sResponse.setAllValues(queryResponse.getResponse());
XMLResponseWriter xmlWriter = new XMLResponseWriter();
try (OutputStreamWriter out = new OutputStreamWriter(outputStream)) {
if (("json").equals(solrParams.get("wt"))) {
response.setCharacterEncoding("UTF-8");
response.setContentType("application/json; charset=UTF-8");
JSONResponseWriter jsonWriter = new JSONResponseWriter();
jsonWriter.write(out, new LocalSolrQueryRequest(null, solrParams), sResponse);
} else {
xmlWriter.write(out, new LocalSolrQueryRequest(null, solrParams), sResponse);
}
out.flush();
} catch (IOException e) {
throw new RuntimeException("Unable to convert Solr response into XML", e);
}
}
}