diff --git a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/hazelcast/HazelcastAutoConfiguration.java b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/hazelcast/HazelcastAutoConfiguration.java index 353a39fa9cb..8f6f5148caf 100644 --- a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/hazelcast/HazelcastAutoConfiguration.java +++ b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/hazelcast/HazelcastAutoConfiguration.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2019 the original author or authors. + * Copyright 2012-2020 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. @@ -19,13 +19,22 @@ package org.springframework.boot.autoconfigure.hazelcast; import com.hazelcast.core.HazelcastInstance; import org.springframework.boot.autoconfigure.EnableAutoConfiguration; +import org.springframework.boot.autoconfigure.condition.ConditionMessage; +import org.springframework.boot.autoconfigure.condition.ConditionMessage.Builder; +import org.springframework.boot.autoconfigure.condition.ConditionOutcome; import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; +import org.springframework.boot.autoconfigure.condition.SpringBootCondition; +import org.springframework.boot.autoconfigure.hazelcast.HazelcastAutoConfiguration.HazelcastDataGridCondition; import org.springframework.boot.context.properties.EnableConfigurationProperties; +import org.springframework.context.annotation.ConditionContext; +import org.springframework.context.annotation.Conditional; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Import; +import org.springframework.core.io.Resource; +import org.springframework.core.type.AnnotatedTypeMetadata; /** - * {@link EnableAutoConfiguration Auto-configuration} for Hazelcast. Creates a + * {@link EnableAutoConfiguration Auto-configuration} for Hazelcast IMDG. Creates a * {@link HazelcastInstance} based on explicit configuration or when a default * configuration file is found in the environment. * @@ -35,9 +44,26 @@ import org.springframework.context.annotation.Import; * @see HazelcastConfigResourceCondition */ @Configuration(proxyBeanMethods = false) +@Conditional(HazelcastDataGridCondition.class) @ConditionalOnClass(HazelcastInstance.class) @EnableConfigurationProperties(HazelcastProperties.class) @Import({ HazelcastClientConfiguration.class, HazelcastServerConfiguration.class }) public class HazelcastAutoConfiguration { + static class HazelcastDataGridCondition extends SpringBootCondition { + + private static final String HAZELCAST_JET_CONFIG_FILE = "classpath:/hazelcast-jet-default.yaml"; + + @Override + public ConditionOutcome getMatchOutcome(ConditionContext context, AnnotatedTypeMetadata metadata) { + Builder message = ConditionMessage.forCondition(HazelcastDataGridCondition.class.getSimpleName()); + Resource resource = context.getResourceLoader().getResource(HAZELCAST_JET_CONFIG_FILE); + if (resource.exists()) { + return ConditionOutcome.noMatch(message.because("Found Hazelcast Jet on the classpath")); + } + return ConditionOutcome.match(message.because("Hazelcast Jet not found on the classpath")); + } + + } + } diff --git a/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/hazelcast/HazelcastAutoConfigurationTests.java b/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/hazelcast/HazelcastAutoConfigurationTests.java index f389c683a7c..9fcf6f62cdd 100644 --- a/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/hazelcast/HazelcastAutoConfigurationTests.java +++ b/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/hazelcast/HazelcastAutoConfigurationTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2019 the original author or authors. + * Copyright 2012-2020 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. @@ -16,6 +16,10 @@ package org.springframework.boot.autoconfigure.hazelcast; +import java.io.IOException; +import java.net.URL; +import java.net.URLClassLoader; + import com.hazelcast.config.Config; import com.hazelcast.core.HazelcastInstance; import org.junit.jupiter.api.Test; @@ -23,6 +27,7 @@ import org.junit.jupiter.api.Test; import org.springframework.boot.autoconfigure.AutoConfigurations; import org.springframework.boot.test.context.runner.ApplicationContextRunner; import org.springframework.core.io.ClassPathResource; +import org.springframework.core.io.Resource; import static org.assertj.core.api.Assertions.assertThat; @@ -47,4 +52,41 @@ class HazelcastAutoConfigurationTests { }); } + @Test + void hazelcastInstanceNotCreatedWhenJetIsPresent() { + this.contextRunner.withClassLoader(new JetConfigClassLoader()) + .run((context) -> assertThat(context).doesNotHaveBean(HazelcastInstance.class)); + } + + /** + * A test {link {@link URLClassLoader} that emulates the default Hazelcast Jet + * configuration file exists on the classpath. + */ + static class JetConfigClassLoader extends URLClassLoader { + + private static final Resource FALLBACK = new ClassPathResource("hazelcast.yaml"); + + JetConfigClassLoader() { + super(new URL[0], JetConfigClassLoader.class.getClassLoader()); + } + + @Override + public URL getResource(String name) { + if (name.equals("hazelcast-jet-default.yaml")) { + return getEmulatedJestConfigUrl(); + } + return super.getResource(name); + } + + private URL getEmulatedJestConfigUrl() { + try { + return FALLBACK.getURL(); + } + catch (IOException ex) { + throw new IllegalArgumentException(ex); + } + } + + } + }