Skip to content

Commit ec845a4

Browse files
author
Ryan Baxter
authored
Use abstract config data post processor (#286)
1 parent e8b7828 commit ec845a4

File tree

4 files changed

+123
-28
lines changed

4 files changed

+123
-28
lines changed

spring-cloud-zookeeper-config/pom.xml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,10 @@
3434
<groupId>org.apache.curator</groupId>
3535
<artifactId>curator-x-discovery</artifactId>
3636
</dependency>
37+
<dependency>
38+
<groupId>org.springframework.cloud</groupId>
39+
<artifactId>spring-cloud-commons</artifactId>
40+
</dependency>
3741
<dependency>
3842
<groupId>org.springframework.cloud</groupId>
3943
<artifactId>spring-cloud-context</artifactId>

spring-cloud-zookeeper-config/src/main/java/org/springframework/cloud/zookeeper/config/ZookeeperConfigDataMissingEnvironmentPostProcessor.java

Lines changed: 10 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -16,21 +16,18 @@
1616

1717
package org.springframework.cloud.zookeeper.config;
1818

19-
import org.springframework.boot.SpringApplication;
2019
import org.springframework.boot.context.config.ConfigDataEnvironmentPostProcessor;
2120
import org.springframework.boot.diagnostics.AbstractFailureAnalyzer;
2221
import org.springframework.boot.diagnostics.FailureAnalysis;
23-
import org.springframework.boot.env.EnvironmentPostProcessor;
22+
import org.springframework.cloud.commons.ConfigDataMissingEnvironmentPostProcessor;
2423
import org.springframework.cloud.zookeeper.ZookeeperProperties;
25-
import org.springframework.core.Ordered;
26-
import org.springframework.core.env.ConfigurableEnvironment;
27-
import org.springframework.util.StringUtils;
24+
import org.springframework.core.env.Environment;
2825

2926
import static org.springframework.cloud.util.PropertyUtils.bootstrapEnabled;
3027
import static org.springframework.cloud.util.PropertyUtils.useLegacyProcessing;
3128
import static org.springframework.cloud.zookeeper.config.ZookeeperConfigDataLocationResolver.PREFIX;
3229

33-
public class ZookeeperConfigDataMissingEnvironmentPostProcessor implements EnvironmentPostProcessor, Ordered {
30+
public class ZookeeperConfigDataMissingEnvironmentPostProcessor extends ConfigDataMissingEnvironmentPostProcessor {
3431

3532
/**
3633
* Order of post processor, set to run after
@@ -44,10 +41,10 @@ public int getOrder() {
4441
}
4542

4643
@Override
47-
public void postProcessEnvironment(ConfigurableEnvironment environment, SpringApplication application) {
44+
protected boolean shouldProcessEnvironment(Environment environment) {
4845
// don't run if using bootstrap or legacy processing
4946
if (bootstrapEnabled(environment) || useLegacyProcessing(environment)) {
50-
return;
47+
return false;
5148
}
5249
boolean coreEnabled = environment.getProperty(ZookeeperProperties.PREFIX + ".enabled", Boolean.class,
5350
true);
@@ -56,26 +53,14 @@ public void postProcessEnvironment(ConfigurableEnvironment environment, SpringAp
5653
boolean importCheckEnabled = environment.getProperty(ZookeeperConfigProperties.PREFIX + ".import-check.enabled",
5754
Boolean.class, true);
5855
if (!coreEnabled || !configEnabled || !importCheckEnabled) {
59-
return;
60-
}
61-
String property = environment.getProperty("spring.config.import");
62-
if (!StringUtils.hasText(property)) {
63-
throw new ImportException("No spring.config.import set", false);
64-
}
65-
if (!property.contains(PREFIX)) {
66-
throw new ImportException("spring.config.import missing " + PREFIX, true);
56+
return false;
6757
}
58+
return true;
6859
}
6960

70-
static class ImportException extends RuntimeException {
71-
72-
final boolean missingPrefix;
73-
74-
ImportException(String message, boolean missingPrefix) {
75-
super(message);
76-
this.missingPrefix = missingPrefix;
77-
}
78-
61+
@Override
62+
protected String getPrefix() {
63+
return PREFIX;
7964
}
8065

8166
static class ImportExceptionFailureAnalyzer extends AbstractFailureAnalyzer<ImportException> {
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,106 @@
1+
/*
2+
* Copyright 2015-2021 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.cloud.zookeeper.config;
18+
19+
import org.junit.jupiter.api.Test;
20+
21+
import org.springframework.boot.SpringApplication;
22+
import org.springframework.mock.env.MockEnvironment;
23+
24+
import static org.assertj.core.api.Assertions.assertThatCode;
25+
import static org.assertj.core.api.Assertions.assertThatThrownBy;
26+
import static org.mockito.Mockito.mock;
27+
28+
/**
29+
* @author Ryan Baxter
30+
*/
31+
class ZookeeperConfigDataMissingEnvironmentPostProcessorTests {
32+
33+
@Test
34+
void noSpringConfigImport() {
35+
MockEnvironment environment = new MockEnvironment();
36+
SpringApplication app = mock(SpringApplication.class);
37+
ZookeeperConfigDataMissingEnvironmentPostProcessor processor = new ZookeeperConfigDataMissingEnvironmentPostProcessor();
38+
assertThatThrownBy(() -> processor.postProcessEnvironment(environment, app))
39+
.isInstanceOf(ZookeeperConfigDataMissingEnvironmentPostProcessor.ImportException.class);
40+
}
41+
42+
@Test
43+
void boostrap() {
44+
MockEnvironment environment = new MockEnvironment();
45+
environment.setProperty("spring.cloud.bootstrap.enabled", "true");
46+
SpringApplication app = mock(SpringApplication.class);
47+
ZookeeperConfigDataMissingEnvironmentPostProcessor processor = new ZookeeperConfigDataMissingEnvironmentPostProcessor();
48+
assertThatCode(() -> processor.postProcessEnvironment(environment, app)).doesNotThrowAnyException();
49+
}
50+
51+
@Test
52+
void legacy() {
53+
MockEnvironment environment = new MockEnvironment();
54+
environment.setProperty("spring.config.use-legacy-processing", "true");
55+
SpringApplication app = mock(SpringApplication.class);
56+
ZookeeperConfigDataMissingEnvironmentPostProcessor processor = new ZookeeperConfigDataMissingEnvironmentPostProcessor();
57+
assertThatCode(() -> processor.postProcessEnvironment(environment, app)).doesNotThrowAnyException();
58+
}
59+
60+
@Test
61+
void configNotEnabled() {
62+
MockEnvironment environment = new MockEnvironment();
63+
environment.setProperty("spring.cloud.zookeeper.enabled", "false");
64+
SpringApplication app = mock(SpringApplication.class);
65+
ZookeeperConfigDataMissingEnvironmentPostProcessor processor = new ZookeeperConfigDataMissingEnvironmentPostProcessor();
66+
assertThatCode(() -> processor.postProcessEnvironment(environment, app)).doesNotThrowAnyException();
67+
}
68+
69+
@Test
70+
void importCheckNotEnabled() {
71+
MockEnvironment environment = new MockEnvironment();
72+
environment.setProperty("spring.cloud.zookeeper.config.import-check.enabled", "false");
73+
SpringApplication app = mock(SpringApplication.class);
74+
ZookeeperConfigDataMissingEnvironmentPostProcessor processor = new ZookeeperConfigDataMissingEnvironmentPostProcessor();
75+
assertThatCode(() -> processor.postProcessEnvironment(environment, app)).doesNotThrowAnyException();
76+
}
77+
78+
@Test
79+
void importSinglePropertySource() {
80+
MockEnvironment environment = new MockEnvironment();
81+
environment.setProperty("spring.config.import", "zookeeper:http://localhost:8888");
82+
SpringApplication app = mock(SpringApplication.class);
83+
ZookeeperConfigDataMissingEnvironmentPostProcessor processor = new ZookeeperConfigDataMissingEnvironmentPostProcessor();
84+
assertThatCode(() -> processor.postProcessEnvironment(environment, app)).doesNotThrowAnyException();
85+
}
86+
87+
@Test
88+
void importMultiplePropertySource() {
89+
MockEnvironment environment = new MockEnvironment();
90+
environment.setProperty("spring.config.import", "zookeeper:http://localhost:8888,file:./app.properties");
91+
SpringApplication app = mock(SpringApplication.class);
92+
ZookeeperConfigDataMissingEnvironmentPostProcessor processor = new ZookeeperConfigDataMissingEnvironmentPostProcessor();
93+
assertThatCode(() -> processor.postProcessEnvironment(environment, app)).doesNotThrowAnyException();
94+
}
95+
96+
@Test
97+
void importMultiplePropertySourceAsList() {
98+
MockEnvironment environment = new MockEnvironment();
99+
environment.setProperty("spring.config.import[0]", "zookeeper:http://localhost:8888");
100+
environment.setProperty("spring.config.import[1]", "file:./app.properties");
101+
SpringApplication app = mock(SpringApplication.class);
102+
ZookeeperConfigDataMissingEnvironmentPostProcessor processor = new ZookeeperConfigDataMissingEnvironmentPostProcessor();
103+
assertThatCode(() -> processor.postProcessEnvironment(environment, app)).doesNotThrowAnyException();
104+
}
105+
106+
}

spring-cloud-zookeeper-config/src/test/java/org/springframework/cloud/zookeeper/config/ZookeeperConfigDataNoImportIntegrationTests.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@
2525
import org.springframework.boot.builder.SpringApplicationBuilder;
2626
import org.springframework.boot.test.system.CapturedOutput;
2727
import org.springframework.boot.test.system.OutputCaptureExtension;
28-
import org.springframework.cloud.zookeeper.config.ZookeeperConfigDataMissingEnvironmentPostProcessor.ImportException;
28+
import org.springframework.cloud.commons.ConfigDataMissingEnvironmentPostProcessor;
2929
import org.springframework.context.ConfigurableApplicationContext;
3030
import org.springframework.context.annotation.Configuration;
3131

@@ -43,7 +43,7 @@ public class ZookeeperConfigDataNoImportIntegrationTests {
4343
@Test
4444
public void exceptionThrownIfNoImport(CapturedOutput output) {
4545
Assertions.assertThatThrownBy(() -> new SpringApplicationBuilder(Config.class).web(WebApplicationType.NONE)
46-
.run("--spring.application.name=" + APP_NAME)).isInstanceOf(ImportException.class);
46+
.run("--spring.application.name=" + APP_NAME)).isInstanceOf(ConfigDataMissingEnvironmentPostProcessor.ImportException.class);
4747

4848
assertThat(output).contains("No spring.config.import property has been defined")
4949
.contains("Add a spring.config.import=zookeeper: property to your configuration");
@@ -53,7 +53,7 @@ public void exceptionThrownIfNoImport(CapturedOutput output) {
5353
public void exceptionThrownIfImportMissingZookeeper(CapturedOutput output) {
5454
Assertions.assertThatThrownBy(() -> new SpringApplicationBuilder(Config.class).web(WebApplicationType.NONE).run(
5555
"--spring.config.import=optional:file:somefile.properties", "--spring.application.name=" + APP_NAME))
56-
.isInstanceOf(ImportException.class);
56+
.isInstanceOf(ConfigDataMissingEnvironmentPostProcessor.ImportException.class);
5757

5858
assertThat(output).contains("spring.config.import property is missing a " + PREFIX)
5959
.contains("Add a spring.config.import=zookeeper: property to your configuration");

0 commit comments

Comments
 (0)