diff --git a/spring-geode/src/main/java/org/springframework/geode/config/annotation/MemberNameConfiguration.java b/spring-geode/src/main/java/org/springframework/geode/config/annotation/MemberNameConfiguration.java index 7e32bbf2..8091f489 100644 --- a/spring-geode/src/main/java/org/springframework/geode/config/annotation/MemberNameConfiguration.java +++ b/spring-geode/src/main/java/org/springframework/geode/config/annotation/MemberNameConfiguration.java @@ -17,14 +17,19 @@ package org.springframework.geode.config.annotation; import java.lang.annotation.Annotation; +import java.util.HashSet; import java.util.Optional; +import java.util.Set; import org.apache.geode.cache.Cache; import org.apache.geode.cache.client.ClientCache; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.ImportAware; +import org.springframework.core.Ordered; import org.springframework.core.annotation.AnnotationAttributes; +import org.springframework.core.annotation.Order; +import org.springframework.core.env.Environment; import org.springframework.core.type.AnnotationMetadata; import org.springframework.data.gemfire.CacheFactoryBean; import org.springframework.data.gemfire.config.annotation.ClientCacheConfigurer; @@ -58,6 +63,21 @@ import org.springframework.util.StringUtils; public class MemberNameConfiguration extends AbstractAnnotationConfigSupport implements ImportAware { private static final String GEMFIRE_NAME_PROPERTY = "name"; + private static final String SPRING_APPLICATION_NAME_PROPERTY = "spring.application.name"; + private static final String SPRING_DATA_GEMFIRE_CACHE_NAME_PROPERTY = "spring.data.gemfire.cache.name"; + private static final String SPRING_DATA_GEMFIRE_NAME_PROPERTY = "spring.data.gemfire.name"; + private static final String SPRING_DATA_GEODE_CACHE_NAME_PROPERTY = "spring.data.geode.cache.name"; + private static final String SPRING_DATA_GEODE_NAME_PROPERTY = "spring.data.geode.name"; + + private static final Set NAME_PROPERTIES = new HashSet<>(); + + static { + NAME_PROPERTIES.add(SPRING_APPLICATION_NAME_PROPERTY); + NAME_PROPERTIES.add(SPRING_DATA_GEMFIRE_CACHE_NAME_PROPERTY); + NAME_PROPERTIES.add(SPRING_DATA_GEMFIRE_NAME_PROPERTY); + NAME_PROPERTIES.add(SPRING_DATA_GEODE_CACHE_NAME_PROPERTY); + NAME_PROPERTIES.add(SPRING_DATA_GEODE_NAME_PROPERTY); + } private String memberName; @@ -96,17 +116,29 @@ public class MemberNameConfiguration extends AbstractAnnotationConfigSupport imp } @Bean - ClientCacheConfigurer clientCacheMemberNameConfigurer() { - return (beaName, clientCacheFactoryBean) -> configureMemberName(clientCacheFactoryBean); + @Order(Ordered.HIGHEST_PRECEDENCE) // apply first (e.g. before CacheNameAutoConfiguration) + ClientCacheConfigurer clientCacheMemberNameConfigurer(Environment environment) { + return (beaName, clientCacheFactoryBean) -> configureMemberName(environment, clientCacheFactoryBean); } @Bean - PeerCacheConfigurer peerCacheMemberNameConfigurer() { - return (beaName, peerCacheFactoryBean) -> configureMemberName(peerCacheFactoryBean); + @Order(Ordered.HIGHEST_PRECEDENCE) // apply first (e.g. before CacheNameAutoConfiguration) + PeerCacheConfigurer peerCacheMemberNameConfigurer(Environment environment) { + return (beaName, peerCacheFactoryBean) -> configureMemberName(environment, peerCacheFactoryBean); } - private void configureMemberName(CacheFactoryBean cacheFactoryBean) { - getMemberName().ifPresent(memberName -> - cacheFactoryBean.getProperties().setProperty(GEMFIRE_NAME_PROPERTY, memberName)); + private void configureMemberName(Environment environment, CacheFactoryBean cacheFactoryBean) { + getMemberName() + .filter(memberName -> namePropertiesNotPresent(environment)) + .ifPresent(memberName -> + cacheFactoryBean.getProperties().setProperty(GEMFIRE_NAME_PROPERTY, memberName)); + } + + private boolean namePropertiesArePresent(Environment environment) { + return NAME_PROPERTIES.stream().anyMatch(environment::containsProperty); + } + + private boolean namePropertiesNotPresent(Environment environment) { + return !namePropertiesArePresent(environment); } } diff --git a/spring-geode/src/main/java/org/springframework/geode/config/annotation/UseMemberName.java b/spring-geode/src/main/java/org/springframework/geode/config/annotation/UseMemberName.java index 907019c9..62caad56 100644 --- a/spring-geode/src/main/java/org/springframework/geode/config/annotation/UseMemberName.java +++ b/spring-geode/src/main/java/org/springframework/geode/config/annotation/UseMemberName.java @@ -52,14 +52,6 @@ import org.springframework.core.annotation.AliasFor; @Import(MemberNameConfiguration.class) public @interface UseMemberName { - /** - * {@link String Name} used for the Apache Geode/Pivotal GemFire distributed system member. - * - * @see #name() - */ - @AliasFor("name") - String value() default ""; - /** * Alias for the {@link String name} of the Apache Geode/Pivotal GemFire distributed system member. * @@ -68,4 +60,12 @@ public @interface UseMemberName { @AliasFor("value") String name() default ""; + /** + * {@link String Name} used for the Apache Geode/Pivotal GemFire distributed system member. + * + * @see #name() + */ + @AliasFor("name") + String value() default ""; + } diff --git a/spring-geode/src/test/java/org/springframework/geode/config/annotation/MemberNameOverridesCacheNameIntegrationTests.java b/spring-geode/src/test/java/org/springframework/geode/config/annotation/MemberNameOverridesCacheNameIntegrationTests.java new file mode 100644 index 00000000..a01afc18 --- /dev/null +++ b/spring-geode/src/test/java/org/springframework/geode/config/annotation/MemberNameOverridesCacheNameIntegrationTests.java @@ -0,0 +1,68 @@ +/* + * Copyright 2018 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.geode.config.annotation; + +import static org.assertj.core.api.Assertions.assertThat; + +import org.apache.geode.cache.GemFireCache; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.gemfire.config.annotation.ClientCacheApplication; +import org.springframework.data.gemfire.config.annotation.PeerCacheApplication; +import org.springframework.data.gemfire.tests.mock.annotation.EnableGemFireMockObjects; +import org.springframework.test.context.ContextConfiguration; +import org.springframework.test.context.junit4.SpringRunner; + +/** + * Integration tests for {@link UseMemberName} and {@link MemberNameConfiguration} asserting that {@link UseMemberName} + * overrides the cache name specified using the {@literal name} attribute of the corresponding caching annotation + * (e.g. {@link ClientCacheApplication#name()} or {@link PeerCacheApplication#name()}. + * + * @author John Blum + * @see org.junit.Test + * @see org.apache.geode.cache.GemFireCache + * @see org.springframework.data.gemfire.config.annotation.ClientCacheApplication + * @see org.springframework.data.gemfire.tests.mock.annotation.EnableGemFireMockObjects + * @see org.springframework.test.context.ContextConfiguration + * @see org.springframework.test.context.junit4.SpringRunner + * @since 1.0.0 + */ +@RunWith(SpringRunner.class) +@ContextConfiguration +@SuppressWarnings("unused") +public class MemberNameOverridesCacheNameIntegrationTests { + + @Autowired + private GemFireCache gemfireCache; + + @Test + public void gemfireNameIsMemberName() { + + assertThat(this.gemfireCache).isNotNull(); + assertThat(this.gemfireCache.getDistributedSystem()).isNotNull(); + assertThat(this.gemfireCache.getDistributedSystem().getProperties()).isNotNull(); + assertThat(this.gemfireCache.getDistributedSystem().getProperties().getProperty("name")) + .isEqualTo("TestMemberName"); + } + + @ClientCacheApplication(name = "TestCacheName") + @UseMemberName("TestMemberName") + @EnableGemFireMockObjects + static class TestConfiguration { } + +}