From 33def6d6b4a3a320b9f10c5e2a99c401196c8ee1 Mon Sep 17 00:00:00 2001 From: Moritz Halbritter Date: Thu, 26 Sep 2024 14:30:42 +0200 Subject: [PATCH] Polish "Add service connection support for Hazelcast" See gh-42416 --- .../HazelcastClientConfiguration.java | 32 +--------- ...zelcastConnectionDetailsConfiguration.java | 62 +++++++++++++++++++ .../spring-boot-docker-compose/build.gradle | 3 +- ...DockerComposeConnectionDetailsFactory.java | 4 +- .../hazelcast/HazelcastEnvironment.java | 5 +- .../hazelcast/HazelcastEnvironmentTests.java | 4 +- ...nectionDetailsFactoryIntegrationTests.java | 2 +- ...castContainerConnectionDetailsFactory.java | 6 +- .../container/HazelcastContainer.java | 9 +++ 9 files changed, 85 insertions(+), 42 deletions(-) create mode 100644 spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/hazelcast/HazelcastConnectionDetailsConfiguration.java diff --git a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/hazelcast/HazelcastClientConfiguration.java b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/hazelcast/HazelcastClientConfiguration.java index 7bfcf7cf2c9..5c6c0585ab0 100644 --- a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/hazelcast/HazelcastClientConfiguration.java +++ b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/hazelcast/HazelcastClientConfiguration.java @@ -17,17 +17,12 @@ package org.springframework.boot.autoconfigure.hazelcast; import com.hazelcast.client.HazelcastClient; -import com.hazelcast.client.config.ClientConfig; import com.hazelcast.core.HazelcastInstance; import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; -import org.springframework.boot.autoconfigure.condition.ConditionalOnSingleCandidate; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Conditional; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Import; -import org.springframework.core.io.ResourceLoader; /** * Configuration for Hazelcast client. @@ -38,34 +33,9 @@ import org.springframework.core.io.ResourceLoader; @Configuration(proxyBeanMethods = false) @ConditionalOnClass(HazelcastClient.class) @ConditionalOnMissingBean(HazelcastInstance.class) -@Import(HazelcastClientInstanceConfiguration.class) +@Import({ HazelcastConnectionDetailsConfiguration.class, HazelcastClientInstanceConfiguration.class }) class HazelcastClientConfiguration { static final String CONFIG_SYSTEM_PROPERTY = "hazelcast.client.config"; - @Configuration(proxyBeanMethods = false) - @ConditionalOnMissingBean({ ClientConfig.class, HazelcastConnectionDetails.class }) - @Conditional(HazelcastClientConfigAvailableCondition.class) - static class HazelcastClientConfigFileConfiguration { - - @Bean - HazelcastConnectionDetails hazelcastConnectionDetails(HazelcastProperties properties, - ResourceLoader resourceLoader) { - return new PropertiesHazelcastConnectionDetails(properties, resourceLoader); - } - - } - - @Configuration(proxyBeanMethods = false) - @ConditionalOnMissingBean(HazelcastConnectionDetails.class) - @ConditionalOnSingleCandidate(ClientConfig.class) - static class HazelcastClientConfigConfiguration { - - @Bean - HazelcastConnectionDetails hazelcastConnectionDetails(ClientConfig config) { - return () -> config; - } - - } - } diff --git a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/hazelcast/HazelcastConnectionDetailsConfiguration.java b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/hazelcast/HazelcastConnectionDetailsConfiguration.java new file mode 100644 index 00000000000..f77569ff37b --- /dev/null +++ b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/hazelcast/HazelcastConnectionDetailsConfiguration.java @@ -0,0 +1,62 @@ +/* + * Copyright 2012-2024 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.springframework.boot.autoconfigure.hazelcast; + +import com.hazelcast.client.config.ClientConfig; + +import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; +import org.springframework.boot.autoconfigure.condition.ConditionalOnSingleCandidate; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Conditional; +import org.springframework.context.annotation.Configuration; +import org.springframework.core.io.ResourceLoader; + +/** + * {@link Configuration} for providing {@link HazelcastConnectionDetails}. + * + * @author Dmytro Nosan + * @author Moritz Halbritter + */ +@Configuration(proxyBeanMethods = false) +class HazelcastConnectionDetailsConfiguration { + + @Configuration(proxyBeanMethods = false) + @ConditionalOnMissingBean({ ClientConfig.class, HazelcastConnectionDetails.class }) + @Conditional(HazelcastClientConfigAvailableCondition.class) + static class HazelcastClientConfigFileConfiguration { + + @Bean + HazelcastConnectionDetails hazelcastConnectionDetails(HazelcastProperties properties, + ResourceLoader resourceLoader) { + return new PropertiesHazelcastConnectionDetails(properties, resourceLoader); + } + + } + + @Configuration(proxyBeanMethods = false) + @ConditionalOnMissingBean(HazelcastConnectionDetails.class) + @ConditionalOnSingleCandidate(ClientConfig.class) + static class HazelcastClientConfigConfiguration { + + @Bean + HazelcastConnectionDetails hazelcastConnectionDetails(ClientConfig config) { + return () -> config; + } + + } + +} diff --git a/spring-boot-project/spring-boot-docker-compose/build.gradle b/spring-boot-project/spring-boot-docker-compose/build.gradle index 86566dbfb96..1cfb0f46e95 100644 --- a/spring-boot-project/spring-boot-docker-compose/build.gradle +++ b/spring-boot-project/spring-boot-docker-compose/build.gradle @@ -19,7 +19,6 @@ dependencies { dockerTestImplementation("org.junit.jupiter:junit-jupiter") dockerTestImplementation("org.testcontainers:testcontainers") - dockerTestRuntimeOnly("com.microsoft.sqlserver:mssql-jdbc") dockerTestRuntimeOnly("com.oracle.database.r2dbc:oracle-r2dbc") dockerTestRuntimeOnly("io.r2dbc:r2dbc-mssql") @@ -31,11 +30,11 @@ dependencies { optional(project(":spring-boot-project:spring-boot-autoconfigure")) optional(project(":spring-boot-project:spring-boot-actuator-autoconfigure")) + optional("com.hazelcast:hazelcast") optional("io.r2dbc:r2dbc-spi") optional("org.mongodb:mongodb-driver-core") optional("org.neo4j.driver:neo4j-java-driver") optional("org.springframework.data:spring-data-r2dbc") - optional("com.hazelcast:hazelcast") testImplementation(project(":spring-boot-project:spring-boot-tools:spring-boot-test-support")) testImplementation(project(":spring-boot-project:spring-boot-test")) diff --git a/spring-boot-project/spring-boot-docker-compose/src/main/java/org/springframework/boot/docker/compose/service/connection/hazelcast/HazelcastDockerComposeConnectionDetailsFactory.java b/spring-boot-project/spring-boot-docker-compose/src/main/java/org/springframework/boot/docker/compose/service/connection/hazelcast/HazelcastDockerComposeConnectionDetailsFactory.java index 315a050c478..ad86ca1d656 100644 --- a/spring-boot-project/spring-boot-docker-compose/src/main/java/org/springframework/boot/docker/compose/service/connection/hazelcast/HazelcastDockerComposeConnectionDetailsFactory.java +++ b/spring-boot-project/spring-boot-docker-compose/src/main/java/org/springframework/boot/docker/compose/service/connection/hazelcast/HazelcastDockerComposeConnectionDetailsFactory.java @@ -66,7 +66,9 @@ class HazelcastDockerComposeConnectionDetailsFactory @Override public ClientConfig getClientConfig() { ClientConfig config = new ClientConfig(); - this.environment.getClusterName().ifPresent(config::setClusterName); + if (this.environment.getClusterName() != null) { + config.setClusterName(this.environment.getClusterName()); + } config.getNetworkConfig().addAddress(this.host + ":" + this.port); return config; } diff --git a/spring-boot-project/spring-boot-docker-compose/src/main/java/org/springframework/boot/docker/compose/service/connection/hazelcast/HazelcastEnvironment.java b/spring-boot-project/spring-boot-docker-compose/src/main/java/org/springframework/boot/docker/compose/service/connection/hazelcast/HazelcastEnvironment.java index f1a503e0fa7..dc4544c8a3c 100644 --- a/spring-boot-project/spring-boot-docker-compose/src/main/java/org/springframework/boot/docker/compose/service/connection/hazelcast/HazelcastEnvironment.java +++ b/spring-boot-project/spring-boot-docker-compose/src/main/java/org/springframework/boot/docker/compose/service/connection/hazelcast/HazelcastEnvironment.java @@ -17,7 +17,6 @@ package org.springframework.boot.docker.compose.service.connection.hazelcast; import java.util.Map; -import java.util.Optional; /** * Hazelcast environment details. @@ -32,8 +31,8 @@ class HazelcastEnvironment { this.clusterName = env.get("HZ_CLUSTERNAME"); } - Optional getClusterName() { - return Optional.ofNullable(this.clusterName); + String getClusterName() { + return this.clusterName; } } diff --git a/spring-boot-project/spring-boot-docker-compose/src/test/java/org/springframework/boot/docker/compose/service/connection/hazelcast/HazelcastEnvironmentTests.java b/spring-boot-project/spring-boot-docker-compose/src/test/java/org/springframework/boot/docker/compose/service/connection/hazelcast/HazelcastEnvironmentTests.java index 2f53a18a02c..a021f47fb4b 100644 --- a/spring-boot-project/spring-boot-docker-compose/src/test/java/org/springframework/boot/docker/compose/service/connection/hazelcast/HazelcastEnvironmentTests.java +++ b/spring-boot-project/spring-boot-docker-compose/src/test/java/org/springframework/boot/docker/compose/service/connection/hazelcast/HazelcastEnvironmentTests.java @@ -33,13 +33,13 @@ class HazelcastEnvironmentTests { @Test void getClusterNameWhenHasNoHzClusterNameSet() { HazelcastEnvironment environment = new HazelcastEnvironment(Collections.emptyMap()); - assertThat(environment.getClusterName()).isEmpty(); + assertThat(environment.getClusterName()).isNull(); } @Test void getClusterNameWhenHzClusterNameSet() { HazelcastEnvironment environment = new HazelcastEnvironment(Map.of("HZ_CLUSTERNAME", "spring-boot")); - assertThat(environment.getClusterName()).isNotEmpty().hasValue("spring-boot"); + assertThat(environment.getClusterName()).isEqualTo("spring-boot"); } } diff --git a/spring-boot-project/spring-boot-testcontainers/src/dockerTest/java/org/springframework/boot/testcontainers/service/connection/hazelcast/CustomClusterNameHazelcastContainerConnectionDetailsFactoryIntegrationTests.java b/spring-boot-project/spring-boot-testcontainers/src/dockerTest/java/org/springframework/boot/testcontainers/service/connection/hazelcast/CustomClusterNameHazelcastContainerConnectionDetailsFactoryIntegrationTests.java index e97ecc24750..a2e4a504401 100644 --- a/spring-boot-project/spring-boot-testcontainers/src/dockerTest/java/org/springframework/boot/testcontainers/service/connection/hazelcast/CustomClusterNameHazelcastContainerConnectionDetailsFactoryIntegrationTests.java +++ b/spring-boot-project/spring-boot-testcontainers/src/dockerTest/java/org/springframework/boot/testcontainers/service/connection/hazelcast/CustomClusterNameHazelcastContainerConnectionDetailsFactoryIntegrationTests.java @@ -52,7 +52,7 @@ class CustomClusterNameHazelcastContainerConnectionDetailsFactoryIntegrationTest @Container @ServiceConnection static final HazelcastContainer hazelcast = TestImage.container(HazelcastContainer.class) - .withEnv("HZ_CLUSTERNAME", "spring-boot"); + .withClusterName("spring-boot"); @Autowired(required = false) private HazelcastConnectionDetails connectionDetails; diff --git a/spring-boot-project/spring-boot-testcontainers/src/main/java/org/springframework/boot/testcontainers/service/connection/hazelcast/HazelcastContainerConnectionDetailsFactory.java b/spring-boot-project/spring-boot-testcontainers/src/main/java/org/springframework/boot/testcontainers/service/connection/hazelcast/HazelcastContainerConnectionDetailsFactory.java index 19486f133b7..5203854b13b 100644 --- a/spring-boot-project/spring-boot-testcontainers/src/main/java/org/springframework/boot/testcontainers/service/connection/hazelcast/HazelcastContainerConnectionDetailsFactory.java +++ b/spring-boot-project/spring-boot-testcontainers/src/main/java/org/springframework/boot/testcontainers/service/connection/hazelcast/HazelcastContainerConnectionDetailsFactory.java @@ -17,7 +17,6 @@ package org.springframework.boot.testcontainers.service.connection.hazelcast; import java.util.Map; -import java.util.Optional; import com.hazelcast.client.config.ClientConfig; import org.testcontainers.containers.Container; @@ -66,7 +65,10 @@ class HazelcastContainerConnectionDetailsFactory ClientConfig config = new ClientConfig(); Container container = getContainer(); Map env = container.getEnvMap(); - Optional.ofNullable(env.get(CLUSTER_NAME_ENV)).ifPresent(config::setClusterName); + String clusterName = env.get(CLUSTER_NAME_ENV); + if (clusterName != null) { + config.setClusterName(clusterName); + } config.getNetworkConfig().addAddress(container.getHost() + ":" + container.getMappedPort(DEFAULT_PORT)); return config; } diff --git a/spring-boot-project/spring-boot-tools/spring-boot-test-support-docker/src/main/java/org/springframework/boot/testsupport/container/HazelcastContainer.java b/spring-boot-project/spring-boot-tools/spring-boot-test-support-docker/src/main/java/org/springframework/boot/testsupport/container/HazelcastContainer.java index 0751d6475af..5ecd99884e3 100644 --- a/spring-boot-project/spring-boot-tools/spring-boot-test-support-docker/src/main/java/org/springframework/boot/testsupport/container/HazelcastContainer.java +++ b/spring-boot-project/spring-boot-tools/spring-boot-test-support-docker/src/main/java/org/springframework/boot/testsupport/container/HazelcastContainer.java @@ -33,4 +33,13 @@ public final class HazelcastContainer extends GenericContainer