package jp.aegif.nemaki.rest;
import java.io.ByteArrayInputStream;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;
import javax.servlet.http.HttpServletRequest;
import javax.ws.rs.FormParam;
import javax.ws.rs.GET;
import javax.ws.rs.POST;
import javax.ws.rs.PUT;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
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 jp.aegif.nemaki.cmis.aspect.query.solr.SolrUtil;
import org.apache.http.HttpResponse;
import org.apache.http.HttpStatus;
import org.apache.http.client.HttpClient;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.HttpClientBuilder;
import org.apache.http.message.BasicNameValuePair;
import org.apache.http.params.HttpParams;
import org.apache.http.util.EntityUtils;
import org.json.simple.JSONArray;
import org.json.simple.JSONObject;
import org.w3c.dom.Node;
@Path("/repo/{repositoryId}/search-engine")
public class SolrResource extends ResourceBase {
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(@PathParam("repositoryId") String repositoryId, @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&repositoryId=" + repositoryId;
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(@PathParam("repositoryId") String repositoryId, @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&repositoryId=" + repositoryId;
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();
}
@POST
@Path("/change_admin_password")
@Produces(MediaType.APPLICATION_JSON)
public String changeAdminPassword(@FormParam("repositoryId") String repositoryId,
@FormParam("password") String password, @FormParam("currentPassword") String currentPassword,
@Context HttpServletRequest request) {
JSONObject result = changeAdminPasswordImpl(repositoryId, password, currentPassword, request);
return result.toString();
}
public JSONObject changeAdminPasswordImpl(String repositoryId, String password, String currentPassword,
HttpServletRequest request) {
boolean status = true;
JSONObject result = new JSONObject();
JSONArray errMsg = new JSONArray();
// Check admin
if (!checkAdmin(errMsg, request)) {
return makeResult(status, result, errMsg);
}
// Call Solr
HttpClient httpClient = HttpClientBuilder.create().build();
String solrUrl = solrUtil.getSolrUrl();
String url = solrUrl + "admin/cores?core=nemaki&action=CHANGE_PASSWORD&tracking=FULL&repositoryId="
+ repositoryId + "&password=" + password + "¤tPassword=" + currentPassword;
HttpGet httpAction = new HttpGet(url);
/*
HttpPost httpAction = new HttpPost(url);
List<BasicNameValuePair> requestParams = new ArrayList<BasicNameValuePair>();
requestParams.add(new BasicNameValuePair("repositoryId",repositoryId));
requestParams.add(new BasicNameValuePair("password",password));
requestParams.add(new BasicNameValuePair("currentPassword",currentPassword));
httpAction.setEntity(new UrlEncodedFormEntity(requestParams));
*/
try {
HttpResponse response = httpClient.execute(httpAction);
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
return makeResult(status, result, errMsg);
}
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;
}
}