package services; import com.google.common.base.Strings; import com.typesafe.config.Config; import helpers.UniversalFunctions; import org.apache.commons.lang3.StringUtils; import org.elasticsearch.action.admin.indices.create.CreateIndexResponse; import org.elasticsearch.action.admin.indices.delete.DeleteIndexRequest; import org.elasticsearch.action.admin.indices.delete.DeleteIndexResponse; import org.elasticsearch.action.admin.indices.refresh.RefreshRequest; import org.elasticsearch.client.Client; import org.elasticsearch.client.transport.TransportClient; import org.elasticsearch.common.settings.Settings; import org.elasticsearch.common.transport.InetSocketTransportAddress; import org.elasticsearch.common.unit.Fuzziness; import org.elasticsearch.node.Node; import org.elasticsearch.node.NodeBuilder; import play.Logger; import java.io.IOException; import java.net.InetAddress; import java.net.UnknownHostException; import java.nio.charset.StandardCharsets; import java.util.HashMap; import java.util.Map; public class ElasticsearchConfig { private static final String INDEX_CONFIG_FILE = "conf/index-config.json"; // CONFIG FILE private Config mConfig; // HOST private String mServer; private Integer mJavaPort; private Node mInternalNode; // CLIENT private String mIndex; private String mType; private String mCluster; private Map<String, String> mClientSettings; private Client mClient; private TransportClient mTransportClient; public ElasticsearchConfig(Config aConfiguration) { mConfig = aConfiguration; init(); } private void init() { // HOST mServer = mConfig.getString("es.host.server"); mJavaPort = mConfig.getInt("es.host.port.java"); mIndex = mConfig.getString("es.index.name"); mType = mConfig.getString("es.index.type"); mCluster = mConfig.getString("es.cluster.name"); if (mConfig.getBoolean("es.node.inmemory") || (mJavaPort == null) || Strings.isNullOrEmpty(mServer)) { mInternalNode = NodeBuilder.nodeBuilder().local(true).data(true).node(); mClient = mInternalNode.client(); } // else { Settings clientSettings = Settings.settingsBuilder() // .put("cluster.name", mCluster) // .put("client.transport.sniff", true) // .build(); mTransportClient = TransportClient.builder().settings(clientSettings).build(); try { mClient = mTransportClient.addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName(mServer), mJavaPort)); } catch (UnknownHostException ex) { throw new RuntimeException(ex); } } if (!indexExists(mIndex)) { CreateIndexResponse response = createIndex(mIndex); refreshElasticsearch(mIndex); if (response.isAcknowledged()) { Logger.info("Created index \"" + mIndex + "\"."); } // else { Logger.warn("Not able to create index \"" + mIndex + "\"."); } } // CLIENT SETTINGS mClientSettings = new HashMap<>(); mClientSettings.put("index.name", mIndex); mClientSettings.put("index.type", mType); mClientSettings.put("cluster.name", mCluster); } public String getIndex() { return mClientSettings.get("index.name"); } public String getType() { return mType; } public String getCluster() { return mCluster; } public String getServer() { return mServer; } public Integer getJavaPort() { return mJavaPort; } public String toString() { return mConfig.toString(); } public String getIndexConfigString() throws IOException { return UniversalFunctions.readFile(INDEX_CONFIG_FILE, StandardCharsets.UTF_8); } public Map<String, String> getClientSettings() { return mClientSettings; } public Client getClient() { return mClient; } private boolean indexExists(String aIndex) { return mClient.admin().indices().prepareExists(aIndex).execute().actionGet().isExists(); } private CreateIndexResponse createIndex(String aIndex) { return mClient.admin().indices().prepareCreate(aIndex).execute().actionGet(); } public DeleteIndexResponse deleteIndex(String aIndex) { return mClient.admin().indices().delete(new DeleteIndexRequest(aIndex)).actionGet(); } private void refreshElasticsearch(String aIndex) { mClient.admin().indices().refresh(new RefreshRequest(aIndex)).actionGet(); } public void tearDown() throws Exception { if (mClient != null) { mClient.close(); } if (mTransportClient != null) { mTransportClient.close(); } if (mInternalNode != null){ mInternalNode.close(); } } public Fuzziness getFuzziness() { String fuzzyString = mConfig.getString("es.search.fuzziness"); if (StringUtils.isEmpty(fuzzyString) || fuzzyString.equals("AUTO")) { return Fuzziness.AUTO; } if (fuzzyString.equals("ZERO")) { return Fuzziness.ZERO; } if (fuzzyString.equals("ONE")) { return Fuzziness.ONE; } if (fuzzyString.equals("TWO")) { return Fuzziness.TWO; } return Fuzziness.AUTO; } }