package com.perforce.spark.search;
import java.util.Map;
import org.apache.http.HttpResponse;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.HttpClientBuilder;
import org.apache.http.util.EntityUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import spark.ModelAndView;
import spark.Request;
import spark.Response;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.perforce.spark.common.AbstractControl;
import com.perforce.spark.navigation.NavBar;
public class SearchControl extends AbstractControl {
private static Logger logger = LoggerFactory.getLogger(SearchControl.class);
public static ModelAndView query(Request request, Response response) {
Map<String, Object> model;
model = NavBar.attributes("search", request);
String qFile = SearchFormID.FILE.get(request);
String qContent = SearchFormID.CONTENT.get(request);
SearchQuery query = new SearchQuery(request, qFile);
// convert query to json string
GsonBuilder gsonBuilder = new GsonBuilder();
Gson gson = gsonBuilder.create();
String jsonQuery = gson.toJson(query);
logger.info(jsonQuery);
// run search and add results to model
try {
SearchPayload payload = search(jsonQuery);
model.put("payload", payload);
logger.info(payload.toString());
return new ModelAndView(model, "page-search.html");
} catch (Exception e) {
return error(e);
}
}
private static SearchPayload search(String jsonQuery) throws Exception {
// POST request to p4 search
HttpClient client = HttpClientBuilder.create().build();
HttpPost post = new HttpPost("http://localhost:8088/api/search");
post.addHeader("content-type", "application/json");
StringEntity entity = new StringEntity(jsonQuery);
post.setEntity(entity);
HttpResponse r = client.execute(post);
// Decode result
String jsonResults = EntityUtils.toString(r.getEntity(), "UTF-8");
GsonBuilder gsonBuilder = new GsonBuilder();
Gson gson = gsonBuilder.create();
SearchPayload payload = gson.fromJson(jsonResults, SearchPayload.class);
return payload;
}
}