package com.constellio.data.dao.services.solr.serverFactories;
import java.io.File;
import java.io.IOException;
import org.apache.solr.client.solrj.SolrClient;
import org.apache.solr.client.solrj.embedded.EmbeddedSolrServer;
import org.apache.solr.core.CoreContainer;
import com.constellio.data.dao.services.solr.FileSystemSolrManagerException;
import com.constellio.data.dao.services.solr.SolrServerFactory;
import com.constellio.data.io.concurrent.filesystem.AtomicFileSystem;
import com.constellio.data.io.services.facades.FileService;
public class CreateStructureUsingDefaultOneEmbeddedSolrServerFactory implements SolrServerFactory {
private static final String DEFAULT_CORE = "default";
File structureFolder;
File defaultStructure;
FileService fileService;
CoreContainer coreContainer;
public CreateStructureUsingDefaultOneEmbeddedSolrServerFactory(FileService fileService, File structureFolder,
File defaultStructure) {
super();
this.fileService = fileService;
this.structureFolder = structureFolder;
this.defaultStructure = defaultStructure;
}
private static void validateStructure(File structureFolder) {
if (!structureFolder.exists()) {
throw FileSystemSolrManagerException.noSuchFolder(structureFolder);
}
File defaultCore = new File(structureFolder, DEFAULT_CORE);
validateCoreFolder(defaultCore);
}
private static void validateCoreFolder(File coreFolder) {
if (!coreFolder.exists()) {
throw FileSystemSolrManagerException.noSuchFolder(coreFolder);
}
File confFolder = new File(coreFolder, "conf");
File solrConfigFile = new File(confFolder, "solrconfig.xml");
if (!solrConfigFile.exists()) {
throw FileSystemSolrManagerException.noSuchSolrConfig(confFolder);
}
File schemaFile = new File(confFolder, "schema.xml");
if (!schemaFile.exists()) {
throw FileSystemSolrManagerException.noSuchSchema(confFolder);
}
}
@Override
public SolrClient newSolrServer(String coreName) {
try {
CoreContainer loadedCoreContainer = getLoadedCoreContainer();
return new EmbeddedSolrServer(loadedCoreContainer, coreName);
} catch (IOException e) {
throw new CreateStructureUsingDefaultOneEmbeddedSolrServerFactoryRuntimeException.CannotCreateSolrServer(e);
}
}
private CoreContainer getLoadedCoreContainer()
throws IOException {
synchronized (this) {
if (coreContainer == null) {
validateStructure(defaultStructure);
fileService.copyDirectory(defaultStructure, structureFolder);
validateStructure(structureFolder);
coreContainer = new CoreContainer(structureFolder.getAbsolutePath());
coreContainer.load();
}
}
return coreContainer;
}
@Override
public void clear() {
if (coreContainer != null) {
coreContainer.shutdown();
coreContainer = null;
}
}
@Override
public AtomicFileSystem getConfigFileSystem(String core) {
throw new UnsupportedOperationException("Not implemented yet");
}
@Override
public AtomicFileSystem getConfigFileSystem() {
throw new UnsupportedOperationException("TODO");
}
@Override
public void reloadSolrServer(String core) {
throw new UnsupportedOperationException("TODO");
}
}