package pl.edu.icm.saos.search.config.service;
import java.io.IOException;
import org.apache.solr.client.solrj.SolrServer;
import org.apache.solr.client.solrj.SolrServerException;
import org.apache.solr.client.solrj.request.CoreAdminRequest;
import org.apache.solr.client.solrj.response.CoreAdminResponse;
import org.apache.solr.common.params.CoreAdminParams.CoreAdminAction;
import org.apache.solr.common.util.NamedList;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.google.common.base.Preconditions;
import pl.edu.icm.saos.search.config.model.IndexConfiguration;
import pl.edu.icm.saos.search.config.model.SolrConfigurationException;
/**
* Informs solr instance that index should be reloaded. If index doesn't
* exists then attempts to create it.
* Can be used only with Solr instances that supports {@link CoreAdminRequest} processing.
* @author madryk
*/
public class SolrIndexReloader implements IndexReloader {
private static Logger log = LoggerFactory.getLogger(SolrIndexReloader.class);
private SolrServer solrServer;
//------------------------ LOGIC --------------------------
@Override
public void reloadIndex(IndexConfiguration indexConfiguration) {
Preconditions.checkNotNull(solrServer);
boolean indexExists = checkIndexExists(indexConfiguration);
if (indexExists) {
reloadIndex(indexConfiguration.getName());
} else {
createIndex(indexConfiguration);
}
}
//------------------------ PRIVATE --------------------------
private boolean checkIndexExists(IndexConfiguration indexConfiguration) {
CoreAdminResponse cores = null;
try {
CoreAdminRequest request = new CoreAdminRequest();
request.setAction(CoreAdminAction.STATUS);
cores = request.process(solrServer);
} catch (SolrServerException | IOException e) {
throw new SolrConfigurationException("Unable to check solr indexes status", e);
}
NamedList<Object> indexStatus = cores.getCoreStatus(indexConfiguration.getName());
return indexStatus != null;
}
private void reloadIndex(String indexName) {
log.info("Reloading solr index with name {}", indexName);
try {
CoreAdminRequest.reloadCore(indexName, solrServer);
} catch (SolrServerException | IOException e) {
throw new SolrConfigurationException("Unable to reload index with name " + indexName, e);
}
}
private void createIndex(IndexConfiguration indexConfiguration) {
log.info("Creating solr index with name {}", indexConfiguration.getName());
try {
CoreAdminRequest.createCore(indexConfiguration.getName(), indexConfiguration.getInstanceDir(), solrServer);
} catch (SolrServerException | IOException e) {
throw new SolrConfigurationException("Unable to create index with name " + indexConfiguration.getName(), e);
}
}
//------------------------ SETTERS --------------------------
public void setSolrServer(SolrServer solrServer) {
this.solrServer = solrServer;
}
}