Skip to content

Commit 33def6d

Browse files
committed
Polish "Add service connection support for Hazelcast"
See gh-42416
1 parent cee7439 commit 33def6d

File tree

9 files changed

+85
-42
lines changed

9 files changed

+85
-42
lines changed

spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/hazelcast/HazelcastClientConfiguration.java

Lines changed: 1 addition & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -17,17 +17,12 @@
1717
package org.springframework.boot.autoconfigure.hazelcast;
1818

1919
import com.hazelcast.client.HazelcastClient;
20-
import com.hazelcast.client.config.ClientConfig;
2120
import com.hazelcast.core.HazelcastInstance;
2221

2322
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
2423
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
25-
import org.springframework.boot.autoconfigure.condition.ConditionalOnSingleCandidate;
26-
import org.springframework.context.annotation.Bean;
27-
import org.springframework.context.annotation.Conditional;
2824
import org.springframework.context.annotation.Configuration;
2925
import org.springframework.context.annotation.Import;
30-
import org.springframework.core.io.ResourceLoader;
3126

3227
/**
3328
* Configuration for Hazelcast client.
@@ -38,34 +33,9 @@
3833
@Configuration(proxyBeanMethods = false)
3934
@ConditionalOnClass(HazelcastClient.class)
4035
@ConditionalOnMissingBean(HazelcastInstance.class)
41-
@Import(HazelcastClientInstanceConfiguration.class)
36+
@Import({ HazelcastConnectionDetailsConfiguration.class, HazelcastClientInstanceConfiguration.class })
4237
class HazelcastClientConfiguration {
4338

4439
static final String CONFIG_SYSTEM_PROPERTY = "hazelcast.client.config";
4540

46-
@Configuration(proxyBeanMethods = false)
47-
@ConditionalOnMissingBean({ ClientConfig.class, HazelcastConnectionDetails.class })
48-
@Conditional(HazelcastClientConfigAvailableCondition.class)
49-
static class HazelcastClientConfigFileConfiguration {
50-
51-
@Bean
52-
HazelcastConnectionDetails hazelcastConnectionDetails(HazelcastProperties properties,
53-
ResourceLoader resourceLoader) {
54-
return new PropertiesHazelcastConnectionDetails(properties, resourceLoader);
55-
}
56-
57-
}
58-
59-
@Configuration(proxyBeanMethods = false)
60-
@ConditionalOnMissingBean(HazelcastConnectionDetails.class)
61-
@ConditionalOnSingleCandidate(ClientConfig.class)
62-
static class HazelcastClientConfigConfiguration {
63-
64-
@Bean
65-
HazelcastConnectionDetails hazelcastConnectionDetails(ClientConfig config) {
66-
return () -> config;
67-
}
68-
69-
}
70-
7141
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
/*
2+
* Copyright 2012-2024 the original author or authors.
3+
*
4+
* Licensed under the Apache License, Version 2.0 (the "License");
5+
* you may not use this file except in compliance with the License.
6+
* You may obtain a copy of the License at
7+
*
8+
* https://www.apache.org/licenses/LICENSE-2.0
9+
*
10+
* Unless required by applicable law or agreed to in writing, software
11+
* distributed under the License is distributed on an "AS IS" BASIS,
12+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
* See the License for the specific language governing permissions and
14+
* limitations under the License.
15+
*/
16+
17+
package org.springframework.boot.autoconfigure.hazelcast;
18+
19+
import com.hazelcast.client.config.ClientConfig;
20+
21+
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
22+
import org.springframework.boot.autoconfigure.condition.ConditionalOnSingleCandidate;
23+
import org.springframework.context.annotation.Bean;
24+
import org.springframework.context.annotation.Conditional;
25+
import org.springframework.context.annotation.Configuration;
26+
import org.springframework.core.io.ResourceLoader;
27+
28+
/**
29+
* {@link Configuration} for providing {@link HazelcastConnectionDetails}.
30+
*
31+
* @author Dmytro Nosan
32+
* @author Moritz Halbritter
33+
*/
34+
@Configuration(proxyBeanMethods = false)
35+
class HazelcastConnectionDetailsConfiguration {
36+
37+
@Configuration(proxyBeanMethods = false)
38+
@ConditionalOnMissingBean({ ClientConfig.class, HazelcastConnectionDetails.class })
39+
@Conditional(HazelcastClientConfigAvailableCondition.class)
40+
static class HazelcastClientConfigFileConfiguration {
41+
42+
@Bean
43+
HazelcastConnectionDetails hazelcastConnectionDetails(HazelcastProperties properties,
44+
ResourceLoader resourceLoader) {
45+
return new PropertiesHazelcastConnectionDetails(properties, resourceLoader);
46+
}
47+
48+
}
49+
50+
@Configuration(proxyBeanMethods = false)
51+
@ConditionalOnMissingBean(HazelcastConnectionDetails.class)
52+
@ConditionalOnSingleCandidate(ClientConfig.class)
53+
static class HazelcastClientConfigConfiguration {
54+
55+
@Bean
56+
HazelcastConnectionDetails hazelcastConnectionDetails(ClientConfig config) {
57+
return () -> config;
58+
}
59+
60+
}
61+
62+
}

spring-boot-project/spring-boot-docker-compose/build.gradle

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,6 @@ dependencies {
1919
dockerTestImplementation("org.junit.jupiter:junit-jupiter")
2020
dockerTestImplementation("org.testcontainers:testcontainers")
2121

22-
2322
dockerTestRuntimeOnly("com.microsoft.sqlserver:mssql-jdbc")
2423
dockerTestRuntimeOnly("com.oracle.database.r2dbc:oracle-r2dbc")
2524
dockerTestRuntimeOnly("io.r2dbc:r2dbc-mssql")
@@ -31,11 +30,11 @@ dependencies {
3130

3231
optional(project(":spring-boot-project:spring-boot-autoconfigure"))
3332
optional(project(":spring-boot-project:spring-boot-actuator-autoconfigure"))
33+
optional("com.hazelcast:hazelcast")
3434
optional("io.r2dbc:r2dbc-spi")
3535
optional("org.mongodb:mongodb-driver-core")
3636
optional("org.neo4j.driver:neo4j-java-driver")
3737
optional("org.springframework.data:spring-data-r2dbc")
38-
optional("com.hazelcast:hazelcast")
3938

4039
testImplementation(project(":spring-boot-project:spring-boot-tools:spring-boot-test-support"))
4140
testImplementation(project(":spring-boot-project:spring-boot-test"))

spring-boot-project/spring-boot-docker-compose/src/main/java/org/springframework/boot/docker/compose/service/connection/hazelcast/HazelcastDockerComposeConnectionDetailsFactory.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,9 @@ static class HazelcastDockerComposeConnectionDetails extends DockerComposeConnec
6666
@Override
6767
public ClientConfig getClientConfig() {
6868
ClientConfig config = new ClientConfig();
69-
this.environment.getClusterName().ifPresent(config::setClusterName);
69+
if (this.environment.getClusterName() != null) {
70+
config.setClusterName(this.environment.getClusterName());
71+
}
7072
config.getNetworkConfig().addAddress(this.host + ":" + this.port);
7173
return config;
7274
}

spring-boot-project/spring-boot-docker-compose/src/main/java/org/springframework/boot/docker/compose/service/connection/hazelcast/HazelcastEnvironment.java

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,6 @@
1717
package org.springframework.boot.docker.compose.service.connection.hazelcast;
1818

1919
import java.util.Map;
20-
import java.util.Optional;
2120

2221
/**
2322
* Hazelcast environment details.
@@ -32,8 +31,8 @@ class HazelcastEnvironment {
3231
this.clusterName = env.get("HZ_CLUSTERNAME");
3332
}
3433

35-
Optional<String> getClusterName() {
36-
return Optional.ofNullable(this.clusterName);
34+
String getClusterName() {
35+
return this.clusterName;
3736
}
3837

3938
}

spring-boot-project/spring-boot-docker-compose/src/test/java/org/springframework/boot/docker/compose/service/connection/hazelcast/HazelcastEnvironmentTests.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -33,13 +33,13 @@ class HazelcastEnvironmentTests {
3333
@Test
3434
void getClusterNameWhenHasNoHzClusterNameSet() {
3535
HazelcastEnvironment environment = new HazelcastEnvironment(Collections.emptyMap());
36-
assertThat(environment.getClusterName()).isEmpty();
36+
assertThat(environment.getClusterName()).isNull();
3737
}
3838

3939
@Test
4040
void getClusterNameWhenHzClusterNameSet() {
4141
HazelcastEnvironment environment = new HazelcastEnvironment(Map.of("HZ_CLUSTERNAME", "spring-boot"));
42-
assertThat(environment.getClusterName()).isNotEmpty().hasValue("spring-boot");
42+
assertThat(environment.getClusterName()).isEqualTo("spring-boot");
4343
}
4444

4545
}

spring-boot-project/spring-boot-testcontainers/src/dockerTest/java/org/springframework/boot/testcontainers/service/connection/hazelcast/CustomClusterNameHazelcastContainerConnectionDetailsFactoryIntegrationTests.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ class CustomClusterNameHazelcastContainerConnectionDetailsFactoryIntegrationTest
5252
@Container
5353
@ServiceConnection
5454
static final HazelcastContainer hazelcast = TestImage.container(HazelcastContainer.class)
55-
.withEnv("HZ_CLUSTERNAME", "spring-boot");
55+
.withClusterName("spring-boot");
5656

5757
@Autowired(required = false)
5858
private HazelcastConnectionDetails connectionDetails;

spring-boot-project/spring-boot-testcontainers/src/main/java/org/springframework/boot/testcontainers/service/connection/hazelcast/HazelcastContainerConnectionDetailsFactory.java

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,6 @@
1717
package org.springframework.boot.testcontainers.service.connection.hazelcast;
1818

1919
import java.util.Map;
20-
import java.util.Optional;
2120

2221
import com.hazelcast.client.config.ClientConfig;
2322
import org.testcontainers.containers.Container;
@@ -66,7 +65,10 @@ public ClientConfig getClientConfig() {
6665
ClientConfig config = new ClientConfig();
6766
Container<?> container = getContainer();
6867
Map<String, String> env = container.getEnvMap();
69-
Optional.ofNullable(env.get(CLUSTER_NAME_ENV)).ifPresent(config::setClusterName);
68+
String clusterName = env.get(CLUSTER_NAME_ENV);
69+
if (clusterName != null) {
70+
config.setClusterName(clusterName);
71+
}
7072
config.getNetworkConfig().addAddress(container.getHost() + ":" + container.getMappedPort(DEFAULT_PORT));
7173
return config;
7274
}

spring-boot-project/spring-boot-tools/spring-boot-test-support-docker/src/main/java/org/springframework/boot/testsupport/container/HazelcastContainer.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,4 +33,13 @@ public HazelcastContainer(DockerImageName dockerImageName) {
3333
addExposedPorts(DEFAULT_PORT);
3434
}
3535

36+
/**
37+
* Sets the cluster name.
38+
* @param clusterName the cluster name
39+
* @return this instance
40+
*/
41+
public HazelcastContainer withClusterName(String clusterName) {
42+
return withEnv("HZ_CLUSTERNAME", clusterName);
43+
}
44+
3645
}

0 commit comments

Comments
 (0)