package org.molgenis.data.elasticsearch.factory; import org.elasticsearch.client.Client; import org.elasticsearch.common.settings.ImmutableSettings; import org.elasticsearch.common.settings.ImmutableSettings.Builder; import org.elasticsearch.common.settings.Settings; import org.elasticsearch.node.Node; import org.molgenis.data.DataService; import org.molgenis.data.elasticsearch.ElasticsearchEntityFactory; import org.molgenis.data.elasticsearch.ElasticsearchService; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.io.Closeable; import java.io.IOException; import java.util.Map; import static org.elasticsearch.node.NodeBuilder.nodeBuilder; /** * Factory for creating an embedded ElasticSearch server service. An elastic search config file named * 'elasticsearch.yml' must be on the classpath * * @author erwin */ public class EmbeddedElasticSearchServiceFactory implements Closeable { private static final Logger LOG = LoggerFactory.getLogger(EmbeddedElasticSearchServiceFactory.class); private static final String CONFIG_FILE_NAME = "elasticsearch.yml"; public static final String DEFAULT_INDEX_NAME = "molgenis"; private final Client client; private final Node node; private final String indexName; public EmbeddedElasticSearchServiceFactory() { this(DEFAULT_INDEX_NAME); } /** * Create an embedded ElasticSearch server service using 'elasticsearch.yml' and provided settings. The provided * settings override settings specified in 'elasticsearch.yml' * * @param providedSettings */ public EmbeddedElasticSearchServiceFactory(Map<String, String> providedSettings) { this(DEFAULT_INDEX_NAME, providedSettings); } public EmbeddedElasticSearchServiceFactory(String indexName) { this(indexName, null); } /** * Create an embedded ElasticSearch server service with the given index name using 'elasticsearch.yml' and provided * settings. The provided settings override settings specified in 'elasticsearch.yml' * * @param indexName * @param providedSettings */ public EmbeddedElasticSearchServiceFactory(String indexName, Map<String, String> providedSettings) { this.indexName = indexName; Builder builder = ImmutableSettings.settingsBuilder().loadFromClasspath(CONFIG_FILE_NAME); if (providedSettings != null) builder.put(providedSettings); Settings settings = builder.build(); node = nodeBuilder().settings(settings).local(true).node(); client = node.client(); LOG.info("Embedded elasticsearch server started, data path=[" + settings.get("path.data") + "]"); } public ElasticsearchService create(DataService dataService, ElasticsearchEntityFactory elasticsearchEntityFactory) { return new ElasticsearchService(client, indexName, dataService, elasticsearchEntityFactory); } public Client getClient() { return client; } @Override public void close() throws IOException { try { client.close(); } catch (Exception e) { LOG.error("Error closing client", e); } try { node.close(); } catch (Exception e) { LOG.error("Error closing node", e); } LOG.info("Elastic search server stopped"); } }