package com.shopizer.search.services.worker;
import java.util.List;
import java.util.Map;
import javax.inject.Inject;
import org.apache.commons.lang3.StringUtils;
import org.apache.log4j.Logger;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.shopizer.search.services.impl.SearchDelegate;
import com.shopizer.search.utils.FileUtil;
import com.shopizer.search.utils.IndexConfiguration;
import com.shopizer.search.utils.SearchClient;
public class ObjectIndexerImpl implements IndexWorker {
private static boolean init = false;
@Inject
private SearchDelegate searchDelegate;
private List<IndexConfiguration> indexConfigurations;
public List<IndexConfiguration> getIndexConfigurations() {
return indexConfigurations;
}
public void setIndexConfigurations(List<IndexConfiguration> indexConfigurations) {
this.indexConfigurations = indexConfigurations;
}
private static Logger log = Logger.getLogger(ObjectIndexerImpl.class);
public synchronized void init(SearchClient client) {
//get the list of configuration
//get the collection name and index name
//get the mapping file
if(init) {
return;
}
init = true;
if(getIndexConfigurations()!=null && getIndexConfigurations().size()>0) {
for(Object o : indexConfigurations) {
IndexConfiguration config = (IndexConfiguration)o;
String mappingFile = null;
String settingsFile = null;
if(!StringUtils.isBlank(config.getMappingFileName())) {
mappingFile = config.getMappingFileName();
}
if(!StringUtils.isBlank(config.getSettingsFileName())) {
settingsFile = config.getSettingsFileName();
}
if(mappingFile!=null || settingsFile!=null) {
String metadata = null;
String settingsdata = null;
try {
if(mappingFile!=null) {
metadata = FileUtil.readFileAsString(mappingFile);
}
if(settingsFile!=null) {
settingsdata = FileUtil.readFileAsString(settingsFile);
}
if(!StringUtils.isBlank(config.getIndexName())) {
if(!searchDelegate.indexExist(config.getCollectionName())) {
searchDelegate.createIndice(metadata, settingsdata, config.getCollectionName(), config.getIndexName());
}
}
} catch (Exception e) {
log.error(e);
log.error("*********************************************");
log.error(e);
log.error("*********************************************");
init=false;
}
}
}
}
}
@SuppressWarnings({ "unchecked", "unused" })
public void execute(SearchClient client, String json, String collection, String object, String id, ExecutionContext context)
throws Exception {
try {
if(!init) {
init(client);
}
//get json object
Map<String,Object> indexData = (Map<String,Object>)context.getObject("indexData");
if(indexData==null) {
ObjectMapper mapper = new ObjectMapper();
indexData = mapper.readValue(json, Map.class);
}
if(context==null) {
context = new ExecutionContext();
}
context.setObject("indexData", indexData);
com.shopizer.search.services.GetResponse r = searchDelegate.getObject(collection, object, id);
if(r!=null) {
searchDelegate.delete(collection, object, id);
}
searchDelegate.index(json, collection, object, id);
} catch (Exception e) {
log.error("Exception while indexing a product, maybe a timing ussue for no shards available",e);
}
}
}