10 changed files with 412 additions and 81 deletions
@ -0,0 +1,83 @@
@@ -0,0 +1,83 @@
|
||||
/* |
||||
* Copyright 2012-2017 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 |
||||
* |
||||
* http://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 java.io.IOException; |
||||
|
||||
import com.hazelcast.client.HazelcastClient; |
||||
import com.hazelcast.client.config.ClientConfig; |
||||
import com.hazelcast.core.HazelcastInstance; |
||||
|
||||
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.Resource; |
||||
|
||||
/** |
||||
* Configuration for Hazelcast client. |
||||
* |
||||
* @author Vedran Pavic |
||||
* @since 2.0.0 |
||||
*/ |
||||
class HazelcastClientConfiguration { |
||||
|
||||
static final String CONFIG_SYSTEM_PROPERTY = "hazelcast.client.config"; |
||||
|
||||
@Configuration |
||||
@ConditionalOnMissingBean(ClientConfig.class) |
||||
@Conditional(ConfigAvailableCondition.class) |
||||
static class HazelcastClientConfigFileConfiguration { |
||||
|
||||
@Bean |
||||
public HazelcastInstance hazelcastInstance(HazelcastProperties properties) |
||||
throws IOException { |
||||
Resource config = properties.resolveConfigLocation(); |
||||
if (config != null) { |
||||
return HazelcastInstanceFactory.createHazelcastClient(config); |
||||
} |
||||
return HazelcastClient.newHazelcastClient(); |
||||
} |
||||
|
||||
} |
||||
|
||||
@Configuration |
||||
@ConditionalOnSingleCandidate(ClientConfig.class) |
||||
static class HazelcastClientConfigConfiguration { |
||||
|
||||
@Bean |
||||
public HazelcastInstance hazelcastInstance(ClientConfig config) { |
||||
return HazelcastInstanceFactory.createHazelcastClient(config); |
||||
} |
||||
|
||||
} |
||||
|
||||
/** |
||||
* {@link HazelcastConfigResourceCondition} that checks if the |
||||
* {@code spring.hazelcast.config} configuration key is defined. |
||||
*/ |
||||
static class ConfigAvailableCondition extends HazelcastConfigResourceCondition { |
||||
|
||||
ConfigAvailableCondition() { |
||||
super(CONFIG_SYSTEM_PROPERTY, "file:./hazelcast-client.xml", |
||||
"classpath:/hazelcast-client.xml"); |
||||
} |
||||
|
||||
} |
||||
|
||||
} |
||||
@ -0,0 +1,84 @@
@@ -0,0 +1,84 @@
|
||||
/* |
||||
* Copyright 2012-2017 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 |
||||
* |
||||
* http://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 java.io.IOException; |
||||
|
||||
import com.hazelcast.config.Config; |
||||
import com.hazelcast.core.Hazelcast; |
||||
import com.hazelcast.core.HazelcastInstance; |
||||
|
||||
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.Resource; |
||||
|
||||
/** |
||||
* Configuration for Hazelcast server. |
||||
* |
||||
* @author Stephane Nicoll |
||||
* @author Vedran Pavic |
||||
* @since 2.0.0 |
||||
*/ |
||||
class HazelcastServerConfiguration { |
||||
|
||||
static final String CONFIG_SYSTEM_PROPERTY = "hazelcast.config"; |
||||
|
||||
@Configuration |
||||
@ConditionalOnMissingBean(Config.class) |
||||
@Conditional(ConfigAvailableCondition.class) |
||||
static class HazelcastServerConfigFileConfiguration { |
||||
|
||||
@Bean |
||||
public HazelcastInstance hazelcastInstance(HazelcastProperties properties) |
||||
throws IOException { |
||||
Resource config = properties.resolveConfigLocation(); |
||||
if (config != null) { |
||||
return HazelcastInstanceFactory.createHazelcastInstance(config); |
||||
} |
||||
return Hazelcast.newHazelcastInstance(); |
||||
} |
||||
|
||||
} |
||||
|
||||
@Configuration |
||||
@ConditionalOnSingleCandidate(Config.class) |
||||
static class HazelcastServerConfigConfiguration { |
||||
|
||||
@Bean |
||||
public HazelcastInstance hazelcastInstance(Config config) { |
||||
return HazelcastInstanceFactory.createHazelcastInstance(config); |
||||
} |
||||
|
||||
} |
||||
|
||||
/** |
||||
* {@link HazelcastConfigResourceCondition} that checks if the |
||||
* {@code spring.hazelcast.config} configuration key is defined. |
||||
*/ |
||||
static class ConfigAvailableCondition extends HazelcastConfigResourceCondition { |
||||
|
||||
ConfigAvailableCondition() { |
||||
super(CONFIG_SYSTEM_PROPERTY, "file:./hazelcast.xml", |
||||
"classpath:/hazelcast.xml"); |
||||
} |
||||
|
||||
} |
||||
|
||||
} |
||||
@ -0,0 +1,155 @@
@@ -0,0 +1,155 @@
|
||||
/* |
||||
* Copyright 2012-2017 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 |
||||
* |
||||
* http://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 java.io.IOException; |
||||
|
||||
import com.hazelcast.client.config.ClientConfig; |
||||
import com.hazelcast.client.impl.HazelcastClientProxy; |
||||
import com.hazelcast.config.Config; |
||||
import com.hazelcast.core.Hazelcast; |
||||
import com.hazelcast.core.HazelcastInstance; |
||||
import org.junit.After; |
||||
import org.junit.AfterClass; |
||||
import org.junit.BeforeClass; |
||||
import org.junit.Rule; |
||||
import org.junit.Test; |
||||
import org.junit.rules.ExpectedException; |
||||
|
||||
import org.springframework.beans.factory.BeanCreationException; |
||||
import org.springframework.boot.test.util.EnvironmentTestUtils; |
||||
import org.springframework.context.annotation.AnnotationConfigApplicationContext; |
||||
import org.springframework.context.annotation.Bean; |
||||
import org.springframework.context.annotation.Configuration; |
||||
|
||||
import static org.assertj.core.api.Assertions.assertThat; |
||||
|
||||
/** |
||||
* Tests for client {@link HazelcastAutoConfiguration}. |
||||
* |
||||
* @author Vedran Pavic |
||||
*/ |
||||
public class HazelcastAutoConfigurationClientTests { |
||||
|
||||
@Rule |
||||
public final ExpectedException thrown = ExpectedException.none(); |
||||
|
||||
private AnnotationConfigApplicationContext context; |
||||
|
||||
@After |
||||
public void closeContext() { |
||||
if (this.context != null) { |
||||
this.context.close(); |
||||
} |
||||
} |
||||
|
||||
private static HazelcastInstance hazelcastInstance; |
||||
|
||||
@BeforeClass |
||||
public static void init() { |
||||
hazelcastInstance = Hazelcast.newHazelcastInstance(); |
||||
} |
||||
|
||||
@AfterClass |
||||
public static void close() { |
||||
if (hazelcastInstance != null) { |
||||
hazelcastInstance.shutdown(); |
||||
} |
||||
} |
||||
|
||||
@Test |
||||
public void systemProperty() throws IOException { |
||||
System.setProperty(HazelcastClientConfiguration.CONFIG_SYSTEM_PROPERTY, |
||||
"classpath:org/springframework/boot/autoconfigure/hazelcast/" + |
||||
"hazelcast-client-specific.xml"); |
||||
try { |
||||
load(); |
||||
HazelcastInstance hazelcastInstance = this.context |
||||
.getBean(HazelcastInstance.class); |
||||
assertThat(hazelcastInstance).isInstanceOf(HazelcastClientProxy.class); |
||||
assertThat(hazelcastInstance.getName()).startsWith("hz.client_"); |
||||
} |
||||
finally { |
||||
System.clearProperty(HazelcastClientConfiguration.CONFIG_SYSTEM_PROPERTY); |
||||
} |
||||
} |
||||
|
||||
@Test |
||||
public void explicitConfigFile() throws IOException { |
||||
load("spring.hazelcast.config=org/springframework/boot/autoconfigure/" |
||||
+ "hazelcast/hazelcast-client-specific.xml"); |
||||
HazelcastInstance hazelcastInstance = this.context |
||||
.getBean(HazelcastInstance.class); |
||||
assertThat(hazelcastInstance).isInstanceOf(HazelcastClientProxy.class); |
||||
assertThat(hazelcastInstance.getName()).startsWith("hz.client_"); |
||||
} |
||||
|
||||
@Test |
||||
public void explicitConfigUrl() throws IOException { |
||||
load("spring.hazelcast.config=hazelcast-client-default.xml"); |
||||
HazelcastInstance hazelcastInstance = this.context |
||||
.getBean(HazelcastInstance.class); |
||||
assertThat(hazelcastInstance).isInstanceOf(HazelcastClientProxy.class); |
||||
assertThat(hazelcastInstance.getName()).startsWith("hz.client_"); |
||||
} |
||||
|
||||
@Test |
||||
public void unknownConfigFile() { |
||||
this.thrown.expect(BeanCreationException.class); |
||||
this.thrown.expectMessage("foo/bar/unknown.xml"); |
||||
load("spring.hazelcast.config=foo/bar/unknown.xml"); |
||||
} |
||||
|
||||
@Test |
||||
public void clientConfigHasPriority() { |
||||
load(HazelcastServerAndClientConfig.class, "spring.hazelcast.config=this-is-ignored.xml"); |
||||
HazelcastInstance hazelcastInstance = this.context |
||||
.getBean(HazelcastInstance.class); |
||||
assertThat(hazelcastInstance).isInstanceOf(HazelcastClientProxy.class); |
||||
} |
||||
|
||||
private void load(String... environment) { |
||||
load(null, environment); |
||||
} |
||||
|
||||
private void load(Class<?> config, String... environment) { |
||||
AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(); |
||||
EnvironmentTestUtils.addEnvironment(applicationContext, environment); |
||||
if (config != null) { |
||||
applicationContext.register(config); |
||||
} |
||||
applicationContext.register(HazelcastAutoConfiguration.class); |
||||
applicationContext.refresh(); |
||||
this.context = applicationContext; |
||||
} |
||||
|
||||
@Configuration |
||||
static class HazelcastServerAndClientConfig { |
||||
|
||||
@Bean |
||||
public Config config() { |
||||
return new Config(); |
||||
} |
||||
|
||||
@Bean |
||||
public ClientConfig clientConfig() { |
||||
return new ClientConfig(); |
||||
} |
||||
|
||||
} |
||||
|
||||
} |
||||
@ -0,0 +1,6 @@
@@ -0,0 +1,6 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?> |
||||
<hazelcast-client xmlns="http://www.hazelcast.com/schema/client-config" |
||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" |
||||
xsi:schemaLocation="http://www.hazelcast.com/schema/client-config hazelcast-client-config-3.8.xsd"> |
||||
|
||||
</hazelcast-client> |
||||
Loading…
Reference in new issue