package pl.edu.icm.saos.search.config.service; import java.io.File; import java.util.Properties; import org.apache.commons.io.FileUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.core.io.Resource; import org.springframework.stereotype.Service; import pl.edu.icm.saos.search.config.model.IndexConfiguration; import pl.edu.icm.saos.search.config.model.SolrConfigurationException; import pl.edu.icm.saos.search.util.SolrConstants; /** * Handles copying configuration files for index * * @author madryk */ @Service public class SolrIndexConfigurationCopier { private static Logger log = LoggerFactory.getLogger(SolrIndexConfigurationCopier.class); //------------------------ LOGIC -------------------------- /** * Copies files needed by index. Target location will be determined * by main Solr data directory (configurationPath argument). * @param indexConfiguration * @param configurationPath */ public void copyIndexConfiguration(IndexConfiguration indexConfiguration, String configurationPath) { log.info("Copying configuration files for index with name {}", indexConfiguration.getName()); File confHomeDir = new File(configurationPath); File indexDir = new File(confHomeDir, indexConfiguration.getInstanceDir()); createDirectory(indexDir); if (indexConfiguration.isCreateIndexPropertyFile()) { createIndexPropertyFile(indexDir, indexConfiguration); } File indexConfDir = new File(indexDir, SolrConstants.INDEX_CONFIG_DIRECTORY_NAME); createDirectory(indexConfDir); for (Resource configurationFile : indexConfiguration.getConfigurationFiles()) { File targetFile = new File(indexConfDir, configurationFile.getFilename()); SearchConfigurationFilesUtils.copyResource(configurationFile, targetFile); } } /** * Deletes index data from disk. If index is marked as * {@link IndexConfiguration persistent} then do nothing. * @param indexConfiguration * @param configurationPath */ public void cleanupIndexConfiguration(IndexConfiguration indexConfiguration, String configurationPath) { if (indexConfiguration.isPersistent()) { return; } log.info("Cleaning configuration files and data for index with name {}", indexConfiguration.getName()); File confHomeDir = new File(configurationPath); File indexDir = new File(confHomeDir, indexConfiguration.getInstanceDir()); FileUtils.deleteQuietly(indexDir); } //------------------------ PRIVATE -------------------------- private void createIndexPropertyFile(File indexDir, IndexConfiguration indexConfiguration) { File targetFile = new File(indexDir, SolrConstants.INDEX_PROPERTIES_FILENAME); Properties indexProperties = new Properties(); indexProperties.put("name", indexConfiguration.getName()); SearchConfigurationFilesUtils.copyProperties(indexProperties, targetFile); } private void createDirectory(File directory) { if (!directory.exists()) { if (!directory.mkdirs()) { throw new SolrConfigurationException("Unable to create directory " + directory.getAbsolutePath()); } } else if (directory.isFile()) { throw new SolrConfigurationException("Found file at location " + directory.getAbsolutePath() + " but expected a directory"); } } }