package com.constellio.data.dao.services.solr.serverFactories;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import org.apache.solr.client.solrj.SolrClient;
import org.apache.solr.client.solrj.SolrServerException;
import org.apache.solr.client.solrj.impl.CloudSolrClient;
import org.apache.solr.client.solrj.request.CollectionAdminRequest;
import org.apache.solr.client.solrj.response.CollectionAdminResponse;
import com.constellio.data.io.concurrent.filesystem.AtomicFileSystem;
import com.constellio.data.io.concurrent.filesystem.ChildAtomicFileSystem;
import com.constellio.data.io.concurrent.filesystem.ZookeeperAtomicFileSystem;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class CloudSolrServerFactory extends AbstractSolrServerFactory {
private static final Logger LOGGER = LoggerFactory.getLogger(CloudSolrServerFactory.class);
private List<AtomicFileSystem> atomicFileSystems = new ArrayList<>();
private List<SolrClient> solrClients = new ArrayList<>();
private static final String CONFIGS = "/configs";
private final String zkHost;
private static final int defaultTimeout = 6000;
public CloudSolrServerFactory(String zkHost) {
super();
this.zkHost = zkHost;
}
@Override
public synchronized SolrClient newSolrServer(String core) {
SolrClient solrClient = getSolrClient(core);
solrClients.add(solrClient);
return solrClient;
}
@Override
public synchronized void clear() {
for (AtomicFileSystem atomicFileSystem : atomicFileSystems) {
atomicFileSystem.close();
}
for (SolrClient solrClient : solrClients)
try {
solrClient.close();
} catch (IOException ioe) {
LOGGER.error("Error while closing solr client", ioe);
}
}
@Override
public synchronized AtomicFileSystem getConfigFileSystem(String core) {
AtomicFileSystem configFileSystem = getAtomicFileSystem(core);
atomicFileSystems.add(configFileSystem);
return configFileSystem;
}
public synchronized AtomicFileSystem getConfigFileSystem() {
AtomicFileSystem configFileSystem = getAtomicFileSystem("");
atomicFileSystems.add(configFileSystem);
return configFileSystem;
}
@Override
public void reloadSolrServer(String core) {
try {
CollectionAdminRequest.Reload reload = new CollectionAdminRequest.Reload();
reload.setCollectionName(core);
CollectionAdminResponse response = reload.process(getAdminServer());
if (!response.isSuccess())
throw new RuntimeException("Core is not reloaded " + response.getErrorMessages());
} catch (SolrServerException | IOException e) {
throw new RuntimeException(e);
}
}
@Override
SolrClient getSolrClient(String core) {
CloudSolrClient solrClient = new CloudSolrClient(zkHost);
solrClient.setDefaultCollection(core);
return solrClient;
}
@Override
AtomicFileSystem getAtomicFileSystem(String core) {
String path = CONFIGS + "/" + core;
if (core.isEmpty())
path = CONFIGS;
return new ChildAtomicFileSystem(new ZookeeperAtomicFileSystem(zkHost, defaultTimeout), path, false);
}
}