From 406f41740ef87b7dd2845dcd27580056668f23d2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edd=C3=BA=20Mel=C3=A9ndez?= Date: Sun, 2 Jul 2017 23:48:03 -0500 Subject: [PATCH] Allow to customize OkHttpClient.Builder This commit enables to auto-configure OkHttpClient.Builder in InfluxDbAutoConfiguration if it is available. See gh-9669 --- .../influx/InfluxDbAutoConfiguration.java | 30 ++++++++-- .../InfluxDbAutoConfigurationTests.java | 56 ++++++++++++++++++- 2 files changed, 79 insertions(+), 7 deletions(-) diff --git a/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/influx/InfluxDbAutoConfiguration.java b/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/influx/InfluxDbAutoConfiguration.java index aa1610fc1e1..5f009f8514a 100644 --- a/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/influx/InfluxDbAutoConfiguration.java +++ b/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/influx/InfluxDbAutoConfiguration.java @@ -16,10 +16,11 @@ package org.springframework.boot.autoconfigure.influx; -import com.google.common.base.Strings; +import okhttp3.OkHttpClient; import org.influxdb.InfluxDB; import org.influxdb.InfluxDBFactory; +import org.springframework.beans.factory.ObjectProvider; import org.springframework.boot.autoconfigure.EnableAutoConfiguration; import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; @@ -27,12 +28,14 @@ import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; import org.springframework.boot.context.properties.EnableConfigurationProperties; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; +import org.springframework.util.StringUtils; /** * {@link EnableAutoConfiguration Auto-configuration} for InfluxDB. * * @author Sergey Kuptsov * @author Stephane Nicoll + * @author Eddú Meléndez * @since 2.0.0 */ @Configuration @@ -42,19 +45,34 @@ public class InfluxDbAutoConfiguration { private final InfluxDbProperties properties; - public InfluxDbAutoConfiguration(InfluxDbProperties properties) { + private final OkHttpClient.Builder builder; + + public InfluxDbAutoConfiguration(InfluxDbProperties properties, + ObjectProvider builder) { this.properties = properties; + this.builder = builder.getIfAvailable(); } @Bean @ConditionalOnMissingBean @ConditionalOnProperty("spring.influx.url") public InfluxDB influxDb() { - if (Strings.isNullOrEmpty(this.properties.getUser())) { - return InfluxDBFactory.connect(this.properties.getUrl()); + if (hasCredentials() && this.builder != null) { + return InfluxDBFactory.connect(this.properties.getUrl(), + this.properties.getUser(), this.properties.getUrl(), this.builder); + } + else if (hasCredentials()) { + return InfluxDBFactory.connect(this.properties.getUrl(), + this.properties.getUser(), this.properties.getPassword()); } - return InfluxDBFactory.connect(this.properties.getUrl(), - this.properties.getUser(), this.properties.getPassword()); + else if (this.builder != null) { + return InfluxDBFactory.connect(this.properties.getUrl(), this.builder); + } + return InfluxDBFactory.connect(this.properties.getUrl()); } + private boolean hasCredentials() { + return StringUtils.hasText(this.properties.getUser()) + && StringUtils.hasText(this.properties.getPassword()); + } } diff --git a/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/influx/InfluxDbAutoConfigurationTests.java b/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/influx/InfluxDbAutoConfigurationTests.java index 1e3c34d93e1..8a2839a6040 100644 --- a/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/influx/InfluxDbAutoConfigurationTests.java +++ b/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/influx/InfluxDbAutoConfigurationTests.java @@ -16,12 +16,20 @@ package org.springframework.boot.autoconfigure.influx; +import java.util.concurrent.TimeUnit; + +import okhttp3.OkHttpClient; import org.influxdb.InfluxDB; +import org.influxdb.impl.InfluxDBImpl; import org.junit.After; import org.junit.Test; +import retrofit2.Retrofit; import org.springframework.boot.test.util.TestPropertyValues; import org.springframework.context.annotation.AnnotationConfigApplicationContext; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.test.util.ReflectionTestUtils; import static org.assertj.core.api.Assertions.assertThat; @@ -30,6 +38,7 @@ import static org.assertj.core.api.Assertions.assertThat; * * @author Sergey Kuptsov * @author Stephane Nicoll + * @author Eddú Meléndez */ public class InfluxDbAutoConfigurationTests { @@ -59,14 +68,59 @@ public class InfluxDbAutoConfigurationTests { public void influxDbCanBeCreatedWithoutCredentials() { load("spring.influx.url=http://localhost"); assertThat(this.context.getBeansOfType(InfluxDB.class)).hasSize(1); + int readTimeout = getReadTimeoutProperty(); + assertThat(readTimeout).isEqualTo(10_000); } - private void load(String... environment) { + @Test + public void influxDbWithoutCredentialsAndOkHttpClientBuilder() { + load(CustomOkHttpClientBuilderConfig.class, "spring.influx.url=http://localhost"); + assertThat(this.context.getBeansOfType(InfluxDB.class)).hasSize(1); + int readTimeout = getReadTimeoutProperty(); + assertThat(readTimeout).isEqualTo(30_000); + } + + @Test + public void influxDbWithOkHttpClientBuilder() { + load(CustomOkHttpClientBuilderConfig.class, "spring.influx.url=http://localhost", + "spring.influx.password:password", "spring.influx.user:user"); + assertThat(this.context.getBeansOfType(InfluxDB.class)).hasSize(1); + int readTimeout = getReadTimeoutProperty(); + assertThat(readTimeout).isEqualTo(30_000); + } + + private int getReadTimeoutProperty() { + InfluxDB influxDB = this.context.getBean(InfluxDB.class); + Retrofit retrofit = (Retrofit) ReflectionTestUtils.getField(influxDB, + InfluxDBImpl.class, "retrofit"); + OkHttpClient callFactory = (OkHttpClient) ReflectionTestUtils.getField(retrofit, + Retrofit.class, "callFactory"); + return callFactory.readTimeoutMillis(); + } + + private void load(Class clazz, String... environment) { AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(); TestPropertyValues.of(environment).applyTo(ctx); ctx.register(InfluxDbAutoConfiguration.class); + if (clazz != null) { + ctx.register(clazz); + } ctx.refresh(); this.context = ctx; } + private void load(String... environment) { + load(null, environment); + } + + @Configuration + static class CustomOkHttpClientBuilderConfig { + + @Bean + public OkHttpClient.Builder builder() { + return new OkHttpClient.Builder().readTimeout(30, TimeUnit.SECONDS); + } + + } + }