package sagan; import com.google.gson.Gson; import com.google.gson.GsonBuilder; import io.searchbox.client.JestClient; import io.searchbox.client.JestClientFactory; import io.searchbox.client.config.HttpClientConfig; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.springframework.beans.factory.annotation.Value; import org.springframework.cloud.Cloud; import org.springframework.cloud.CloudFactory; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Profile; import org.springframework.util.Assert; import java.util.Properties; abstract class AbstractSearchClientConfig { private static Log logger = LogFactory.getLog(AbstractSearchClientConfig.class); protected abstract String getSearchClientConnectionUri(); @Bean public Gson gson() { return new GsonBuilder().setDateFormat("yyyy-MM-dd'T'HH:mm:ssXXX").create(); } @Bean public JestClient jestClient() { String connectionUri = getSearchClientConnectionUri(); logger.info("**** Elastic Search endpoint: " + connectionUri); HttpClientConfig clientConfig = new HttpClientConfig .Builder(connectionUri) .multiThreaded(true) .gson(gson()) .build(); JestClientFactory factory = new JestClientFactory(); factory.setHttpClientConfig(clientConfig); return factory.getObject(); } } @Configuration @Profile(SaganProfiles.STANDALONE) class StandaloneSearchClientConfig extends AbstractSearchClientConfig { @Value("${elasticsearch.client.endpoint}") private String endpoint; @Override protected String getSearchClientConnectionUri() { return endpoint; } } @Configuration @Profile(SaganProfiles.CLOUDFOUNDRY) class CloudFoundrySearchClientConfig extends AbstractSearchClientConfig { private final static String SAGAN_SEARCH_CONNECTION_URI_KEY = "cloud.services.sagan-search.connection.uri"; @Bean public Cloud cloud() { return new CloudFactory().getCloud(); } @Override protected String getSearchClientConnectionUri() { Properties cloudProps = cloud().getCloudProperties(); String connectionUri = cloudProps.getProperty(SAGAN_SEARCH_CONNECTION_URI_KEY); Assert.notNull(connectionUri, "ElasticSearch endpoint URI should not be null: " + SAGAN_SEARCH_CONNECTION_URI_KEY); return connectionUri; } }