// Path: src/main/java/com/amebame/triton/config/TritonElasticSearchClusterConfiguration.java
// public class TritonElasticSearchClusterConfiguration {
// 	
// 	private ImmutableSettings.Builder builder;
// 	
// 	private String[] hosts;
// 	
// 	public TritonElasticSearchClusterConfiguration() {
// 		builder = ImmutableSettings.builder();
// 		builder.put("client.transport.ignore_cluster_name", true);
// 	}
// 	
// 	/**
// 	 * Set cluster name.
// 	 * @param name
// 	 */
// 	public void setName(String name) {
// 		builder.put("cluster.name", name);
// 	}
// 	
// 	/**
// 	 * Set to true to sniff and add cluster machines.
// 	 * @param sniff
// 	 */
// 	public void setSniff(boolean sniff) {
// 		builder.put("client.transport.sniff", sniff);
// 	}
// 	
// 	/**
// 	 * Set to true to ignore cluster name validation.
// 	 * @param ignore
// 	 */
// 	public void setIgnoreClusterName(boolean ignore) {
// 		builder.put("client.transport.ignore_cluster_name", true);
// 	}
// 	
// 	/**
// 	 * Set host address list.
// 	 * @param hosts ["127.0.0.1:9300", "127.0.0.2:9300", ..]
// 	 */
// 	public void setHosts(String[] hosts) {
// 		this.hosts = hosts;
// 	}
// 	
// 	/**
// 	 * Set single host address and port
// 	 * @param host 127.0.0.1:9300
// 	 */
// 	public void setHost(String host) {
// 		this.hosts = new String[]{ host };
// 	}
// 	
// 	/**
// 	 * Get host address list.
// 	 * @return
// 	 */
// 	public String[] getHosts() {
// 		return this.hosts;
// 	}
// 	
// 	/**
// 	 * Get settings to create client.
// 	 * @return
// 	 */
// 	public Settings getSettings() {
// 		return builder.build();
// 	}
// 	
// 	/**
// 	 * Create {@link Client} to connect to the cluster.
// 	 * @return
// 	 */
// 	public Client createClient() {
// 		TransportClient client = new TransportClient(getSettings());
// 		for (String host : hosts) {
// 			client.addTransportAddress(new InetSocketTransportAddress(AddrUtil.getOneAddress(host)));
// 		}
// 		return client;
// 	}
// 
// }
// 
// Path: src/main/java/com/amebame/triton/config/TritonElasticSearchConfiguration.java
// public class TritonElasticSearchConfiguration implements TritonCleaner {
// 
// 	// Cluster configuraiton map
// 	private Map<String, TritonElasticSearchClusterConfiguration> clusters;
// 	
// 	// Timeout for ElasticSearch (default 5 sec)
// 	private long timeout = 5000L;
// 	
// 	public TritonElasticSearchConfiguration() {
// 		clusters = new HashMap<>();
// 	}
// 	
// 	@Override
// 	public void clean() {
// 	}
// 
// 	/**
// 	 * Set cluster configuraiton map
// 	 * @param clusters
// 	 */
// 	public void setClusters(Map<String, TritonElasticSearchClusterConfiguration> clusters) {
// 		this.clusters = clusters;
// 	}
// 	
// 	/**
// 	 * Get cluster configuraiton map
// 	 * @return
// 	 */
// 	public Map<String, TritonElasticSearchClusterConfiguration> getClusters() {
// 		return clusters;
// 	}
// 	
// 	/**
// 	 * Get cluster keys which are registered
// 	 * @return
// 	 */
// 	public Set<String> getClusterKeys() {
// 		return clusters.keySet();
// 	}
// 
// 	/**
// 	 * Get cluster configuration.
// 	 * @param key
// 	 * @return
// 	 */
// 	public TritonElasticSearchClusterConfiguration getClusterConfiguration(String key) {
// 		return clusters.get(key);
// 	}
// 	
// 	/**
// 	 * Set the timeout value in milliseconds.
// 	 * @param timeout
// 	 */
// 	public void setTimeout(long timeout) {
// 		this.timeout = timeout;
// 	}
// 	
// 	/**
// 	 * Get the milliseconds of timeout.
// 	 * @return
// 	 */
// 	public long getTimeout() {
// 		return timeout;
// 	}
// }
// 
// Path: src/main/java/com/amebame/triton/server/TritonCleaner.java
// public interface TritonCleaner {
// 	
// 	/**
// 	 * Clean the resource.
// 	 */
// 	void clean();
// 
// }


import java.util.HashMap;
import java.util.Map;
import javax.inject.Inject;
import org.apache.commons.lang.StringUtils;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.elasticsearch.client.Client;
import com.amebame.triton.config.TritonElasticSearchClusterConfiguration;
import com.amebame.triton.config.TritonElasticSearchConfiguration;
import com.amebame.triton.exception.TritonErrors;
import com.amebame.triton.server.TritonCleaner;
package com.amebame.triton.service.elasticsearch;





/**
 * {@link TritonElasticSearchClient} provides {@link Client} instances.
 */
public class TritonElasticSearchClient implements TritonCleaner {
	
	private static final Logger log = LogManager.getLogger(TritonElasticSearchClient.class);

	// configuration
	private TritonElasticSearchConfiguration config;
	
	// client map which are registered
	private Map<String, Client> clients;

	@Inject
	public TritonElasticSearchClient(TritonElasticSearchConfiguration config) {
		this.config = config;
		buildClients();
	}
	
	/**
	 * Get client which has connected to the cluster.
	 * @param key
	 * @return
	 */
// Path: src/main/java/com/amebame/triton/config/TritonElasticSearchClusterConfiguration.java
// public class TritonElasticSearchClusterConfiguration {
// 	
// 	private ImmutableSettings.Builder builder;
// 	
// 	private String[] hosts;
// 	
// 	public TritonElasticSearchClusterConfiguration() {
// 		builder = ImmutableSettings.builder();
// 		builder.put("client.transport.ignore_cluster_name", true);
// 	}
// 	
// 	/**
// 	 * Set cluster name.
// 	 * @param name
// 	 */
// 	public void setName(String name) {
// 		builder.put("cluster.name", name);
// 	}
// 	
// 	/**
// 	 * Set to true to sniff and add cluster machines.
// 	 * @param sniff
// 	 */
// 	public void setSniff(boolean sniff) {
// 		builder.put("client.transport.sniff", sniff);
// 	}
// 	
// 	/**
// 	 * Set to true to ignore cluster name validation.
// 	 * @param ignore
// 	 */
// 	public void setIgnoreClusterName(boolean ignore) {
// 		builder.put("client.transport.ignore_cluster_name", true);
// 	}
// 	
// 	/**
// 	 * Set host address list.
// 	 * @param hosts ["127.0.0.1:9300", "127.0.0.2:9300", ..]
// 	 */
// 	public void setHosts(String[] hosts) {
// 		this.hosts = hosts;
// 	}
// 	
// 	/**
// 	 * Set single host address and port
// 	 * @param host 127.0.0.1:9300
// 	 */
// 	public void setHost(String host) {
// 		this.hosts = new String[]{ host };
// 	}
// 	
// 	/**
// 	 * Get host address list.
// 	 * @return
// 	 */
// 	public String[] getHosts() {
// 		return this.hosts;
// 	}
// 	
// 	/**
// 	 * Get settings to create client.
// 	 * @return
// 	 */
// 	public Settings getSettings() {
// 		return builder.build();
// 	}
// 	
// 	/**
// 	 * Create {@link Client} to connect to the cluster.
// 	 * @return
// 	 */
// 	public Client createClient() {
// 		TransportClient client = new TransportClient(getSettings());
// 		for (String host : hosts) {
// 			client.addTransportAddress(new InetSocketTransportAddress(AddrUtil.getOneAddress(host)));
// 		}
// 		return client;
// 	}
// 
// }
// 
// Path: src/main/java/com/amebame/triton/config/TritonElasticSearchConfiguration.java
// public class TritonElasticSearchConfiguration implements TritonCleaner {
// 
// 	// Cluster configuraiton map
// 	private Map<String, TritonElasticSearchClusterConfiguration> clusters;
// 	
// 	// Timeout for ElasticSearch (default 5 sec)
// 	private long timeout = 5000L;
// 	
// 	public TritonElasticSearchConfiguration() {
// 		clusters = new HashMap<>();
// 	}
// 	
// 	@Override
// 	public void clean() {
// 	}
// 
// 	/**
// 	 * Set cluster configuraiton map
// 	 * @param clusters
// 	 */
// 	public void setClusters(Map<String, TritonElasticSearchClusterConfiguration> clusters) {
// 		this.clusters = clusters;
// 	}
// 	
// 	/**
// 	 * Get cluster configuraiton map
// 	 * @return
// 	 */
// 	public Map<String, TritonElasticSearchClusterConfiguration> getClusters() {
// 		return clusters;
// 	}
// 	
// 	/**
// 	 * Get cluster keys which are registered
// 	 * @return
// 	 */
// 	public Set<String> getClusterKeys() {
// 		return clusters.keySet();
// 	}
// 
// 	/**
// 	 * Get cluster configuration.
// 	 * @param key
// 	 * @return
// 	 */
// 	public TritonElasticSearchClusterConfiguration getClusterConfiguration(String key) {
// 		return clusters.get(key);
// 	}
// 	
// 	/**
// 	 * Set the timeout value in milliseconds.
// 	 * @param timeout
// 	 */
// 	public void setTimeout(long timeout) {
// 		this.timeout = timeout;
// 	}
// 	
// 	/**
// 	 * Get the milliseconds of timeout.
// 	 * @return
// 	 */
// 	public long getTimeout() {
// 		return timeout;
// 	}
// }
// 
// Path: src/main/java/com/amebame/triton/server/TritonCleaner.java
// public interface TritonCleaner {
// 	
// 	/**
// 	 * Clean the resource.
// 	 */
// 	void clean();
// 
// }


// Path: src/main/java/com/amebame/triton/service/elasticsearch/TritonElasticSearchClient.java
import java.util.HashMap;
import java.util.Map;
import javax.inject.Inject;
import org.apache.commons.lang.StringUtils;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.elasticsearch.client.Client;
import com.amebame.triton.config.TritonElasticSearchClusterConfiguration;
import com.amebame.triton.config.TritonElasticSearchConfiguration;
import com.amebame.triton.exception.TritonErrors;
import com.amebame.triton.server.TritonCleaner;

package com.amebame.triton.service.elasticsearch;





/**
 * {@link TritonElasticSearchClient} provides {@link Client} instances.
 */
public class TritonElasticSearchClient implements TritonCleaner {
	
	private static final Logger log = LogManager.getLogger(TritonElasticSearchClient.class);

	// configuration
	private TritonElasticSearchConfiguration config;
	
	// client map which are registered
	private Map<String, Client> clients;

	@Inject
	public TritonElasticSearchClient(TritonElasticSearchConfiguration config) {
		this.config = config;
		buildClients();
	}
	
	/**
	 * Get client which has connected to the cluster.
	 * @param key
	 * @return
	 */
	public Client getClient(String key) {