package org.sef4j.elasticsearch;
import java.beans.PropertyChangeListener;
import java.beans.PropertyChangeSupport;
import java.util.Arrays;
import java.util.concurrent.Callable;
import org.elasticsearch.client.Client;
import org.elasticsearch.client.transport.TransportClient;
import org.elasticsearch.common.settings.ImmutableSettings;
import org.elasticsearch.common.settings.Settings;
import org.elasticsearch.common.transport.TransportAddress;
import org.sef4j.core.util.IPropertyChangeListenerSupport;
/**
* a provider for ElasticSearch Client using a list of TransportClient URLs
*
* the list of URLs may change at runtime, as cluster may change at runtime (node are up/down/created/destroyed...)
*/
public class DefaultElasticSearchClientProvider implements Callable<Client>, IPropertyChangeListenerSupport {
private Settings settings;
private TransportAddress[] transportAddresses;
private PropertyChangeSupport propChangeSupport = new PropertyChangeSupport(this);
// ------------------------------------------------------------------------
public DefaultElasticSearchClientProvider(Settings settings, TransportAddress[] transportAddresses) {
this.settings = (settings != null)? settings: ImmutableSettings.Builder.EMPTY_SETTINGS;
this.transportAddresses = transportAddresses;
}
// ------------------------------------------------------------------------
@SuppressWarnings("resource")
@Override
public Client call() throws Exception {
return new TransportClient(settings)
.addTransportAddresses(transportAddresses);
}
/** implements IPropertyChangeListenerSupport, so that client may be reconfigured at runtime when cluster change */
@Override
public void addPropertyChangeListener(PropertyChangeListener listener) {
propChangeSupport.addPropertyChangeListener(listener);
}
/** implements IPropertyChangeListenerSupport, so that client may be reconfigured at runtime when cluster change */
@Override
public void removePropertyChangeListener(PropertyChangeListener listener) {
propChangeSupport.removePropertyChangeListener(listener);
}
// ------------------------------------------------------------------------
@Override
public String toString() {
return "ElasticSearchClientProvider ["
+ "addresses=" + Arrays.toString(transportAddresses)
+ "]";
}
}