Commit 00a3ad0f authored by HaiTao Zhang's avatar HaiTao Zhang Committed by Madhura Bhave

Added support for devtools YAML configuration

See gh-17915
parent b43827d6
...@@ -19,6 +19,7 @@ package org.springframework.boot.devtools.env; ...@@ -19,6 +19,7 @@ package org.springframework.boot.devtools.env;
import java.io.File; import java.io.File;
import java.io.IOException; import java.io.IOException;
import java.util.Properties; import java.util.Properties;
import java.util.logging.Logger;
import org.springframework.boot.SpringApplication; import org.springframework.boot.SpringApplication;
import org.springframework.boot.devtools.DevToolsEnablementDeducer; import org.springframework.boot.devtools.DevToolsEnablementDeducer;
...@@ -35,29 +36,47 @@ import org.springframework.util.StringUtils; ...@@ -35,29 +36,47 @@ import org.springframework.util.StringUtils;
* *
* @author Phillip Webb * @author Phillip Webb
* @author Andy Wilkinson * @author Andy Wilkinson
* @author HaiTao Zhang
* @since 1.3.0 * @since 1.3.0
*/ */
public class DevToolsHomePropertiesPostProcessor implements EnvironmentPostProcessor { public class DevToolsHomePropertiesPostProcessor implements EnvironmentPostProcessor {
private static final String FILE_NAME = ".spring-boot-devtools.properties"; private static final String[] FILE_NAMES = new String[] { ".spring-boot-devtools.yml", ".spring-boot-devtools.yaml",
".spring-boot-devtools.properties" };
private Logger logger = Logger.getLogger(getClass().getName());
@Override @Override
public void postProcessEnvironment(ConfigurableEnvironment environment, SpringApplication application) { public void postProcessEnvironment(ConfigurableEnvironment environment, SpringApplication application) {
if (DevToolsEnablementDeducer.shouldEnable(Thread.currentThread())) { if (DevToolsEnablementDeducer.shouldEnable(Thread.currentThread())) {
File home = getHomeFolder(); File home = getHomeFolder();
File propertyFile = (home != null) ? new File(home, FILE_NAME) : null; Properties properties = processDir(home, "/.config/spring-boot/", environment);
if (properties.isEmpty()) {
processDir(home, "", environment);
}
}
}
private Properties processDir(File home, String configPath, ConfigurableEnvironment environment) {
Properties properties = new Properties();
for (String fileName : FILE_NAMES) {
File propertyFile = (home != null) ? new File(home, configPath + fileName) : null;
if (propertyFile != null && propertyFile.exists() && propertyFile.isFile()) { if (propertyFile != null && propertyFile.exists() && propertyFile.isFile()) {
addProperty(propertyFile, environment, fileName, properties);
}
}
return properties;
}
private void addProperty(File propertyFile, ConfigurableEnvironment environment, String fileName,
Properties properties) {
FileSystemResource resource = new FileSystemResource(propertyFile); FileSystemResource resource = new FileSystemResource(propertyFile);
Properties properties;
try { try {
properties = PropertiesLoaderUtils.loadProperties(resource); PropertiesLoaderUtils.fillProperties(properties, resource);
environment.getPropertySources() environment.getPropertySources().addFirst(new PropertiesPropertySource("devtools-local", properties));
.addFirst(new PropertiesPropertySource("devtools-local", properties));
} }
catch (IOException ex) { catch (IOException ex) {
throw new IllegalStateException("Unable to load " + FILE_NAME, ex); throw new IllegalStateException("Unable to load " + fileName, ex);
}
}
} }
} }
......
...@@ -36,6 +36,7 @@ import static org.assertj.core.api.Assertions.assertThat; ...@@ -36,6 +36,7 @@ import static org.assertj.core.api.Assertions.assertThat;
* *
* @author Phillip Webb * @author Phillip Webb
* @author Andy Wilkinson * @author Andy Wilkinson
* @author HaiTao Zhang
*/ */
class DevToolsHomePropertiesPostProcessorTests { class DevToolsHomePropertiesPostProcessorTests {
...@@ -47,7 +48,7 @@ class DevToolsHomePropertiesPostProcessorTests { ...@@ -47,7 +48,7 @@ class DevToolsHomePropertiesPostProcessorTests {
} }
@Test @Test
void loadsHomeProperties() throws Exception { void loadsPropertiesFromHomeFolderUsingProperties() throws Exception {
Properties properties = new Properties(); Properties properties = new Properties();
properties.put("abc", "def"); properties.put("abc", "def");
OutputStream out = new FileOutputStream(new File(this.home, ".spring-boot-devtools.properties")); OutputStream out = new FileOutputStream(new File(this.home, ".spring-boot-devtools.properties"));
...@@ -59,6 +60,137 @@ class DevToolsHomePropertiesPostProcessorTests { ...@@ -59,6 +60,137 @@ class DevToolsHomePropertiesPostProcessorTests {
assertThat(environment.getProperty("abc")).isEqualTo("def"); assertThat(environment.getProperty("abc")).isEqualTo("def");
} }
@Test
void loadsPropertiesFromHomeFolderUsingYml() throws Exception {
Properties properties = new Properties();
properties.put("abc", "def");
OutputStream out = new FileOutputStream(new File(this.home, ".spring-boot-devtools.yml"));
properties.store(out, null);
out.close();
ConfigurableEnvironment environment = new MockEnvironment();
MockDevToolHomePropertiesPostProcessor postProcessor = new MockDevToolHomePropertiesPostProcessor();
runPostProcessor(() -> postProcessor.postProcessEnvironment(environment, null));
assertThat(environment.getProperty("abc")).isEqualTo("def");
}
@Test
void loadsPropertiesFromHomeFolderUsingYaml() throws Exception {
Properties properties = new Properties();
properties.put("abc", "def");
OutputStream out = new FileOutputStream(new File(this.home, ".spring-boot-devtools.yaml"));
properties.store(out, null);
out.close();
ConfigurableEnvironment environment = new MockEnvironment();
MockDevToolHomePropertiesPostProcessor postProcessor = new MockDevToolHomePropertiesPostProcessor();
runPostProcessor(() -> postProcessor.postProcessEnvironment(environment, null));
assertThat(environment.getProperty("abc")).isEqualTo("def");
}
@Test
void loadsPropertiesFromConfigFolderUsingProperties() throws Exception {
Properties properties = new Properties();
new File(this.home + "/.config/spring-boot").mkdirs();
properties.put("abc", "def");
OutputStream out = new FileOutputStream(
new File(this.home + "/.config/spring-boot", ".spring-boot-devtools.properties"));
properties.store(out, null);
out.close();
ConfigurableEnvironment environment = new MockEnvironment();
MockDevToolHomePropertiesPostProcessor postProcessor = new MockDevToolHomePropertiesPostProcessor();
runPostProcessor(() -> postProcessor.postProcessEnvironment(environment, null));
assertThat(environment.getProperty("abc")).isEqualTo("def");
}
@Test
void loadsPropertiesFromConfigFolderUsingYml() throws Exception {
Properties properties = new Properties();
new File(this.home + "/.config/spring-boot").mkdirs();
properties.put("abc", "def");
OutputStream out = new FileOutputStream(
new File(this.home + "/.config/spring-boot", ".spring-boot-devtools.yml"));
properties.store(out, null);
out.close();
ConfigurableEnvironment environment = new MockEnvironment();
MockDevToolHomePropertiesPostProcessor postProcessor = new MockDevToolHomePropertiesPostProcessor();
runPostProcessor(() -> postProcessor.postProcessEnvironment(environment, null));
assertThat(environment.getProperty("abc")).isEqualTo("def");
}
@Test
void loadsPropertiesFromConfigFolderUsingYaml() throws Exception {
Properties properties = new Properties();
new File(this.home + "/.config/spring-boot").mkdirs();
properties.put("abc", "def");
OutputStream out = new FileOutputStream(
new File(this.home + "/.config/spring-boot", ".spring-boot-devtools.yaml"));
properties.store(out, null);
out.close();
ConfigurableEnvironment environment = new MockEnvironment();
MockDevToolHomePropertiesPostProcessor postProcessor = new MockDevToolHomePropertiesPostProcessor();
runPostProcessor(() -> postProcessor.postProcessEnvironment(environment, null));
assertThat(environment.getProperty("abc")).isEqualTo("def");
}
@Test
void loadFromConfigFolderWithPropertiesTakingPrecedence() throws Exception {
Properties properties = new Properties();
properties.put("abc", "def");
new File(this.home + "/.config/spring-boot").mkdirs();
OutputStream out = new FileOutputStream(
new File(this.home + "/.config/spring-boot/", ".spring-boot-devtools.yaml"));
properties.store(out, null);
out.close();
Properties properties2 = new Properties();
properties2.put("abc", "jkl");
OutputStream out2 = new FileOutputStream(
new File(this.home + "/.config/spring-boot/", ".spring-boot-devtools.properties"));
properties2.store(out2, null);
out2.close();
ConfigurableEnvironment environment = new MockEnvironment();
MockDevToolHomePropertiesPostProcessor postProcessor = new MockDevToolHomePropertiesPostProcessor();
runPostProcessor(() -> postProcessor.postProcessEnvironment(environment, null));
assertThat(environment.getProperty("abc")).isEqualTo("jkl");
}
@Test
void loadFromHomeFolderWithPropertiesTakingPrecedence() throws Exception {
Properties properties = new Properties();
properties.put("abc", "def");
new File(this.home + "/.config/spring-boot").mkdirs();
OutputStream out = new FileOutputStream(new File(this.home, ".spring-boot-devtools.yaml"));
properties.store(out, null);
out.close();
Properties properties2 = new Properties();
properties2.put("abc", "jkl");
OutputStream out2 = new FileOutputStream(new File(this.home, ".spring-boot-devtools.properties"));
properties2.store(out2, null);
out2.close();
ConfigurableEnvironment environment = new MockEnvironment();
MockDevToolHomePropertiesPostProcessor postProcessor = new MockDevToolHomePropertiesPostProcessor();
runPostProcessor(() -> postProcessor.postProcessEnvironment(environment, null));
assertThat(environment.getProperty("abc")).isEqualTo("jkl");
}
@Test
void loadFromConfigFolderTakesPrecedenceOverHomeFolder() throws Exception {
Properties properties = new Properties();
properties.put("abc", "def");
new File(this.home + "/.config/spring-boot").mkdirs();
OutputStream out = new FileOutputStream(new File(this.home, ".spring-boot-devtools.properties"));
properties.store(out, null);
out.close();
Properties properties2 = new Properties();
properties2.put("abc", "jkl");
OutputStream out2 = new FileOutputStream(
new File(this.home + "/.config/spring-boot/", ".spring-boot-devtools.properties"));
properties2.store(out2, null);
out2.close();
ConfigurableEnvironment environment = new MockEnvironment();
MockDevToolHomePropertiesPostProcessor postProcessor = new MockDevToolHomePropertiesPostProcessor();
runPostProcessor(() -> postProcessor.postProcessEnvironment(environment, null));
assertThat(environment.getProperty("abc")).isEqualTo("jkl");
}
@Test @Test
void ignoresMissingHomeProperties() throws Exception { void ignoresMissingHomeProperties() throws Exception {
ConfigurableEnvironment environment = new MockEnvironment(); ConfigurableEnvironment environment = new MockEnvironment();
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment