package me.osm.gazetteer.web.api;
import java.io.File;
import java.util.Collections;
import java.util.HashSet;
import java.util.List;
import java.util.Locale;
import java.util.Set;
import me.osm.gazetteer.web.ESNodeHolder;
import me.osm.gazetteer.web.api.meta.Endpoint;
import me.osm.gazetteer.web.api.meta.Parameter;
import me.osm.gazetteer.web.imp.IndexHolder;
import me.osm.gazetteer.web.utils.FileUtils;
import me.osm.gazetteer.web.utils.FileUtils.LineHandler;
import me.osm.gazetteer.web.utils.OSMDocSinglton;
import me.osm.osmdoc.localization.L10n;
import me.osm.osmdoc.model.Feature;
import org.apache.commons.lang3.StringUtils;
import org.elasticsearch.action.admin.indices.exists.indices.IndicesExistsRequestBuilder;
import org.elasticsearch.action.admin.indices.exists.indices.IndicesExistsResponse;
import org.elasticsearch.action.bulk.BulkRequestBuilder;
import org.elasticsearch.action.delete.DeleteRequestBuilder;
import org.elasticsearch.action.index.IndexRequestBuilder;
import org.json.JSONArray;
import org.json.JSONObject;
import org.restexpress.Request;
import org.restexpress.Response;
import org.restexpress.domain.metadata.UriMetadata;
public class ImportOSMDoc implements DocumentedApi {
public JSONObject read(Request request, Response response){
String source = request.getHeader("source");
boolean drop = "true".equals(request.getHeader("drop"));
return run(source, drop);
}
public JSONObject run(String source, boolean drop) {
JSONObject result = new JSONObject();
if(drop) {
new DeleteRequestBuilder(ESNodeHolder.getClient(), "gazetteer")
.setType(IndexHolder.POI_CLASS).execute().actionGet();
}
IndicesExistsResponse response =
new IndicesExistsRequestBuilder(ESNodeHolder.getClient().admin().indices())
.setIndices("gazetteer").execute().actionGet();
if (!response.isExists()) {
IndexHolder.createIndex();
}
final BulkRequestBuilder bulk = ESNodeHolder.getClient().prepareBulk();
List<JSONObject> features = OSMDocSinglton.get().getFacade().listTranslatedFeatures(null);
for(JSONObject obj : features) {
IndexRequestBuilder ind = new IndexRequestBuilder(ESNodeHolder.getClient())
.setSource(obj.toString()).setIndex("gazetteer").setType(IndexHolder.POI_CLASS);
bulk.add(ind.request());
}
if(StringUtils.isNotEmpty(source)) {
FileUtils.handleLines(new File(source), new LineHandler() {
@Override
public void handle(String s) {
if(s != null) {
JSONObject obj = new JSONObject(s);
String name = obj.getString("name");
Feature feature = OSMDocSinglton.get().getFacade().getFeature(name);
JSONArray namesTrans = new JSONArray();
for(String lt : L10n.supported) {
String translatedTitle = OSMDocSinglton.get().getFacade()
.getTranslatedTitle(feature, Locale.forLanguageTag(lt));
namesTrans.put(translatedTitle);
}
obj.put("name_trans", namesTrans);
Set<String> kwds = new HashSet<String>();
OSMDocSinglton.get().getFacade().collectKeywords(
Collections.singleton(feature), null, kwds, null);
obj.put("keywords", new JSONArray(kwds));
IndexRequestBuilder ind = new IndexRequestBuilder(ESNodeHolder.getClient())
.setSource(obj.toString()).setIndex("gazetteer").setType(IndexHolder.POI_CLASS);
bulk.add(ind.request());
}
}
});
result.put("result", "success");
}
else {
result.put("message", "Empty source");
result.put("result", "skip");
}
if(bulk.numberOfActions() > 0) {
bulk.execute().actionGet();
}
return result;
}
@Override
public Endpoint getMeta(UriMetadata uriMetadata) {
Endpoint meta = new Endpoint(uriMetadata.getPattern(), "OSM Doc Import",
"Imports POI classification.");
meta.getUrlParameters().add(new Parameter("source",
"Path to osmdoc catalog folder or xml. "
+ "Password protected endpoint."));
return meta;
}
}