package jp.aegif.nemaki.rest;
import java.io.ByteArrayInputStream;
import java.io.InputStream;
import javax.servlet.http.HttpServletRequest;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.core.Context;
import javax.ws.rs.core.MediaType;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import org.apache.http.HttpResponse;
import org.apache.http.HttpStatus;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.HttpClientBuilder;
import org.apache.http.util.EntityUtils;
import org.json.simple.JSONArray;
import org.json.simple.JSONObject;
import org.w3c.dom.Node;
import jp.aegif.nemaki.cmis.aspect.query.solr.SolrUtil;
@Path("/all/search-engine")
public class SolrAllResource extends ResourceBase {
@Context private HttpServletRequest servletRequest;
private SolrUtil solrUtil;
@GET
@Path("/url")
@Produces(MediaType.APPLICATION_JSON)
public String url() {
boolean status = true;
JSONObject result = new JSONObject();
JSONArray errMsg = new JSONArray();
String solrUrl = solrUtil.getSolrUrl();
result.put("url", solrUrl);
// Output
result = makeResult(status, result, errMsg);
return result.toJSONString();
}
@GET
@Path("/init")
@Produces(MediaType.APPLICATION_JSON)
public String initialize(@Context HttpServletRequest request) {
boolean status = true;
JSONObject result = new JSONObject();
JSONArray errMsg = new JSONArray();
//Check admin
if(!checkAdmin(errMsg, request)){
return makeResult(status, result, errMsg).toString();
}
//Call Solr
HttpClient httpClient = HttpClientBuilder.create().build();
String solrUrl = solrUtil.getSolrUrl();
String url = solrUrl + "admin/cores?core=nemaki&action=init";
HttpGet httpGet = new HttpGet(url);
try {
HttpResponse response = httpClient.execute(httpGet);
int responseStatus = response.getStatusLine().getStatusCode();
if(HttpStatus.SC_OK != responseStatus){
throw new Exception("Solr server connection failed");
}
String body = EntityUtils.toString(response.getEntity(), "UTF-8");
if(checkSuccess(body)){
status = true;
}else{
status = false;
//TODO error message
}
} catch (Exception e) {
status = false;
//TODO error message
e.printStackTrace();
}
// Output
result = makeResult(status, result, errMsg);
return result.toString();
}
@GET
@Path("/reindex")
@Produces(MediaType.APPLICATION_JSON)
public String reindex(@Context HttpServletRequest request) {
boolean status = true;
JSONObject result = new JSONObject();
JSONArray errMsg = new JSONArray();
//Check admin
if(!checkAdmin(errMsg, request)){
return makeResult(status, result, errMsg).toString();
}
//Call Solr
HttpClient httpClient = HttpClientBuilder.create().build();
String solrUrl = solrUtil.getSolrUrl();
String url = solrUrl + "admin/cores?core=nemaki&action=index&tracking=FULL";
HttpGet httpGet = new HttpGet(url);
try {
HttpResponse response = httpClient.execute(httpGet);
int responseStatus = response.getStatusLine().getStatusCode();
if(HttpStatus.SC_OK != responseStatus){
throw new Exception("Solr server connection failed");
}
String body = EntityUtils.toString(response.getEntity(), "UTF-8");
if(checkSuccess(body)){
status = true;
}else{
status = false;
//TODO error message
}
} catch (Exception e) {
status = false;
//TODO error message
e.printStackTrace();
}
// Output
result = makeResult(status, result, errMsg);
return result.toString();
}
private boolean checkSuccess(String xml) throws Exception{
//sanitize
xml = xml.replace("\n", "");
//parse
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
DocumentBuilder db = dbf.newDocumentBuilder();
//traverse
InputStream bais = new ByteArrayInputStream(xml.getBytes("utf-8"));
Node root = db.parse(bais);
Node response = root.getFirstChild();
Node lst = response.getFirstChild();
Node status = lst.getFirstChild();
//check
return "0".equals(status.getTextContent());
}
public void setSolrUtil(SolrUtil solrUtil) {
this.solrUtil = solrUtil;
}
}