From 70aea7c358a5550cd791e45bac0459cfb9d9fc09 Mon Sep 17 00:00:00 2001 From: Dave Syer Date: Thu, 21 Sep 2017 13:54:35 +0100 Subject: [PATCH] Fix ordering issues in environment repository config --- .../EnvironmentRepositoryConfiguration.java | 150 ++++++++++-------- .../environment/EnvironmentController.java | 20 ++- ...ubversionConfigServerIntegrationTests.java | 16 +- 3 files changed, 100 insertions(+), 86 deletions(-) diff --git a/spring-cloud-config-server/src/main/java/org/springframework/cloud/config/server/config/EnvironmentRepositoryConfiguration.java b/spring-cloud-config-server/src/main/java/org/springframework/cloud/config/server/config/EnvironmentRepositoryConfiguration.java index d982064a..d66fe444 100644 --- a/spring-cloud-config-server/src/main/java/org/springframework/cloud/config/server/config/EnvironmentRepositoryConfiguration.java +++ b/spring-cloud-config-server/src/main/java/org/springframework/cloud/config/server/config/EnvironmentRepositoryConfiguration.java @@ -30,6 +30,7 @@ import org.springframework.cloud.config.server.environment.SvnKitEnvironmentRepo import org.springframework.cloud.config.server.environment.VaultEnvironmentRepository; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Import; import org.springframework.context.annotation.Profile; import org.springframework.core.env.ConfigurableEnvironment; import org.springframework.web.client.RestTemplate; @@ -40,83 +41,18 @@ import org.springframework.web.client.RestTemplate; * */ @Configuration +@Import({ VaultRepositoryConfiguration.class, SvnRepositoryConfiguration.class, + NativeRepositoryConfiguration.class, GitRepositoryConfiguration.class, + DefaultRepositoryConfiguration.class }) public class EnvironmentRepositoryConfiguration { @Bean @ConditionalOnProperty(value = "spring.cloud.config.server.health.enabled", matchIfMissing = true) - public ConfigServerHealthIndicator configServerHealthIndicator(EnvironmentRepository repository) { + public ConfigServerHealthIndicator configServerHealthIndicator( + EnvironmentRepository repository) { return new ConfigServerHealthIndicator(repository); } - @Configuration - @ConditionalOnMissingBean(EnvironmentRepository.class) - protected static class DefaultRepositoryConfiguration { - - @Autowired - private ConfigurableEnvironment environment; - - @Autowired - private ConfigServerProperties server; - - @Autowired(required = false) - private TransportConfigCallback transportConfigCallback; - - @Bean - public MultipleJGitEnvironmentRepository defaultEnvironmentRepository() { - MultipleJGitEnvironmentRepository repository = new MultipleJGitEnvironmentRepository(this.environment); - repository.setTransportConfigCallback(this.transportConfigCallback); - if (this.server.getDefaultLabel()!=null) { - repository.setDefaultLabel(this.server.getDefaultLabel()); - } - return repository; - } - } - - @Configuration - @Profile("native") - protected static class NativeRepositoryConfiguration { - - @Autowired - private ConfigurableEnvironment environment; - - @Bean - public NativeEnvironmentRepository nativeEnvironmentRepository() { - return new NativeEnvironmentRepository(this.environment); - } - } - - @Configuration - @Profile("git") - protected static class GitRepositoryConfiguration extends DefaultRepositoryConfiguration {} - - @Configuration - @Profile("subversion") - protected static class SvnRepositoryConfiguration { - @Autowired - private ConfigurableEnvironment environment; - - @Autowired - private ConfigServerProperties server; - - @Bean - public SvnKitEnvironmentRepository svnKitEnvironmentRepository() { - SvnKitEnvironmentRepository repository = new SvnKitEnvironmentRepository(this.environment); - if (this.server.getDefaultLabel()!=null) { - repository.setDefaultLabel(this.server.getDefaultLabel()); - } - return repository; - } - } - - @Configuration - @Profile("vault") - protected static class VaultConfiguration { - @Bean - public VaultEnvironmentRepository vaultEnvironmentRepository(HttpServletRequest request, EnvironmentWatch watch) { - return new VaultEnvironmentRepository(request, watch, new RestTemplate()); - } - } - @Configuration @ConditionalOnProperty(value = "spring.cloud.config.server.consul.watch.enabled") protected static class ConsulEnvironmentWatchConfiguration { @@ -137,3 +73,77 @@ public class EnvironmentRepositoryConfiguration { } } } + +@Configuration +@ConditionalOnMissingBean(EnvironmentRepository.class) +class DefaultRepositoryConfiguration { + + @Autowired + private ConfigurableEnvironment environment; + + @Autowired + private ConfigServerProperties server; + + @Autowired(required = false) + private TransportConfigCallback transportConfigCallback; + + @Bean + public MultipleJGitEnvironmentRepository defaultEnvironmentRepository() { + MultipleJGitEnvironmentRepository repository = new MultipleJGitEnvironmentRepository( + this.environment); + repository.setTransportConfigCallback(this.transportConfigCallback); + if (this.server.getDefaultLabel() != null) { + repository.setDefaultLabel(this.server.getDefaultLabel()); + } + return repository; + } +} + +@Configuration +@ConditionalOnMissingBean(EnvironmentRepository.class) +@Profile("native") +class NativeRepositoryConfiguration { + + @Autowired + private ConfigurableEnvironment environment; + + @Bean + public NativeEnvironmentRepository nativeEnvironmentRepository() { + return new NativeEnvironmentRepository(this.environment); + } +} + +@Configuration +@Profile("git") +class GitRepositoryConfiguration extends DefaultRepositoryConfiguration { +} + +@Configuration +@Profile("subversion") +class SvnRepositoryConfiguration { + @Autowired + private ConfigurableEnvironment environment; + + @Autowired + private ConfigServerProperties server; + + @Bean + public SvnKitEnvironmentRepository svnKitEnvironmentRepository() { + SvnKitEnvironmentRepository repository = new SvnKitEnvironmentRepository( + this.environment); + if (this.server.getDefaultLabel() != null) { + repository.setDefaultLabel(this.server.getDefaultLabel()); + } + return repository; + } +} + +@Configuration +@Profile("vault") +class VaultRepositoryConfiguration { + @Bean + public VaultEnvironmentRepository vaultEnvironmentRepository( + HttpServletRequest request, EnvironmentWatch watch) { + return new VaultEnvironmentRepository(request, watch, new RestTemplate()); + } +} diff --git a/spring-cloud-config-server/src/main/java/org/springframework/cloud/config/server/environment/EnvironmentController.java b/spring-cloud-config-server/src/main/java/org/springframework/cloud/config/server/environment/EnvironmentController.java index f5d20db1..7d040c33 100644 --- a/spring-cloud-config-server/src/main/java/org/springframework/cloud/config/server/environment/EnvironmentController.java +++ b/spring-cloud-config-server/src/main/java/org/springframework/cloud/config/server/environment/EnvironmentController.java @@ -15,9 +15,6 @@ */ package org.springframework.cloud.config.server.environment; -import static org.springframework.cloud.config.server.support.EnvironmentPropertySource.prepareEnvironment; -import static org.springframework.cloud.config.server.support.EnvironmentPropertySource.resolvePlaceholders; - import java.io.IOException; import java.util.ArrayList; import java.util.Collection; @@ -31,6 +28,12 @@ import java.util.TreeMap; import javax.servlet.http.HttpServletResponse; +import com.fasterxml.jackson.databind.ObjectMapper; + +import org.yaml.snakeyaml.DumperOptions.FlowStyle; +import org.yaml.snakeyaml.Yaml; +import org.yaml.snakeyaml.nodes.Tag; + import org.springframework.cloud.config.environment.Environment; import org.springframework.cloud.config.environment.PropertySource; import org.springframework.http.HttpHeaders; @@ -42,13 +45,10 @@ import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.RequestParam; -import org.springframework.web.bind.annotation.ResponseStatus; import org.springframework.web.bind.annotation.RestController; -import org.yaml.snakeyaml.DumperOptions.FlowStyle; -import org.yaml.snakeyaml.Yaml; -import org.yaml.snakeyaml.nodes.Tag; -import com.fasterxml.jackson.databind.ObjectMapper; +import static org.springframework.cloud.config.server.support.EnvironmentPropertySource.prepareEnvironment; +import static org.springframework.cloud.config.server.support.EnvironmentPropertySource.resolvePlaceholders; /** * @author Dave Syer @@ -345,6 +345,7 @@ public class EnvironmentController { private void setMapValue(Map map, Object value) { String key = getKey(); if (NodeType.MAP.equals(valueType)) { + @SuppressWarnings("unchecked") Map nestedMap = (Map) map.get(key); if (nestedMap == null) { nestedMap = new LinkedHashMap<>(); @@ -352,6 +353,7 @@ public class EnvironmentController { } setMapValue(nestedMap, value); } else if (NodeType.ARRAY.equals(valueType)) { + @SuppressWarnings("unchecked") List list = (List) map.get(key); if (list == null) { list = new ArrayList<>(); @@ -370,6 +372,7 @@ public class EnvironmentController { list.add(null); } if (NodeType.MAP.equals(valueType)) { + @SuppressWarnings("unchecked") Map map = (Map) list.get(index); if (map == null) { map = new LinkedHashMap<>(); @@ -377,6 +380,7 @@ public class EnvironmentController { } setMapValue(map, value); } else if (NodeType.ARRAY.equals(valueType)) { + @SuppressWarnings("unchecked") List nestedList = (List) list.get(index); if (nestedList == null) { nestedList = new ArrayList<>(); diff --git a/spring-cloud-config-server/src/test/java/org/springframework/cloud/config/server/SubversionConfigServerIntegrationTests.java b/spring-cloud-config-server/src/test/java/org/springframework/cloud/config/server/SubversionConfigServerIntegrationTests.java index 608fbe26..c2e08400 100644 --- a/spring-cloud-config-server/src/test/java/org/springframework/cloud/config/server/SubversionConfigServerIntegrationTests.java +++ b/spring-cloud-config-server/src/test/java/org/springframework/cloud/config/server/SubversionConfigServerIntegrationTests.java @@ -42,10 +42,10 @@ import static org.springframework.boot.test.context.SpringBootTest.WebEnvironmen * @author Roy Clarkson */ @RunWith(SpringRunner.class) -@SpringBootTest(classes = ConfigServerApplication.class, - properties = { "spring.config.name:configserver", - "spring.cloud.config.server.svn.uri:file:///./target/repos/svn-config-repo" }, - webEnvironment = RANDOM_PORT) +@SpringBootTest(classes = ConfigServerApplication.class, properties = { + "spring.config.name:configserver", + "spring.cloud.config.server.svn.uri:file:///./target/repos/svn-config-repo", + "logging.level.org.springframework.cloud=DEBUG" }, webEnvironment = RANDOM_PORT) @ActiveProfiles("subversion") public class SubversionConfigServerIntegrationTests { @@ -63,12 +63,12 @@ public class SubversionConfigServerIntegrationTests { @Test public void contextLoads() { - Environment environment = new TestRestTemplate().getForObject("http://localhost:" - + this.port + "/foo/development/", Environment.class); + Environment environment = new TestRestTemplate().getForObject( + "http://localhost:" + this.port + "/foo/development/", Environment.class); assertFalse(environment.getPropertySources().isEmpty()); assertEquals("overrides", environment.getPropertySources().get(0).getName()); - assertEquals("{spring.cloud.config.enabled=true}", environment - .getPropertySources().get(0).getSource().toString()); + assertEquals("{spring.cloud.config.enabled=true}", + environment.getPropertySources().get(0).getSource().toString()); } @Test