Skip to content

Commit

Permalink
Merge branch '2.4.x' into 2.5.x
Browse files Browse the repository at this point in the history
Closes gh-27346
  • Loading branch information
wilkinsona committed Jul 15, 2021
2 parents 765b1ae + 7a23a12 commit d415913
Show file tree
Hide file tree
Showing 2 changed files with 112 additions and 1 deletion.
Expand Up @@ -313,7 +313,7 @@ private Map<String, Object> applyInput(String qualifiedKey) {

private Map<String, Object> getInput(String property, ConfigurationProperty candidate) {
Map<String, Object> input = new LinkedHashMap<>();
Object value = candidate.getValue();
Object value = stringifyIfNecessary(candidate.getValue());
Origin origin = Origin.from(candidate);
List<Origin> originParents = Origin.parentsFrom(candidate);
input.put("value", this.sanitizer.sanitize(property, value));
Expand All @@ -324,6 +324,16 @@ private Map<String, Object> getInput(String property, ConfigurationProperty cand
return input;
}

private Object stringifyIfNecessary(Object value) {
if (value == null || value.getClass().isPrimitive()) {
return value;
}
if (CharSequence.class.isAssignableFrom(value.getClass())) {
return value.toString();
}
return "Complex property value " + value.getClass().getName();
}

private String getQualifiedKey(String prefix, String key) {
return (prefix.isEmpty() ? prefix : prefix + ".") + key;
}
Expand Down
Expand Up @@ -16,8 +16,12 @@

package org.springframework.boot.actuate.context.properties;

import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.InetAddress;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
Expand All @@ -28,11 +32,16 @@
import org.springframework.boot.actuate.context.properties.ConfigurationPropertiesReportEndpoint.ApplicationConfigurationProperties;
import org.springframework.boot.actuate.context.properties.ConfigurationPropertiesReportEndpoint.ConfigurationPropertiesBeanDescriptor;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.boot.context.properties.ConfigurationPropertiesBinding;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.boot.test.context.runner.ApplicationContextRunner;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import;
import org.springframework.core.convert.converter.Converter;
import org.springframework.core.env.ConfigurableEnvironment;
import org.springframework.core.env.MapPropertySource;
import org.springframework.core.io.InputStreamSource;

import static org.assertj.core.api.Assertions.assertThat;
import static org.assertj.core.api.Assertions.entry;
Expand Down Expand Up @@ -238,6 +247,43 @@ void hikariDataSourceConfigurationPropertiesBeanCanBeSerialized() {
});
}

@Test
@SuppressWarnings("unchecked")
void endpointResponseUsesToStringOfCharSequenceAsPropertyValue() throws IOException {
ApplicationContextRunner contextRunner = new ApplicationContextRunner().withInitializer((context) -> {
ConfigurableEnvironment environment = context.getEnvironment();
environment.getPropertySources().addFirst(new MapPropertySource("test",
Collections.singletonMap("foo.name", new CharSequenceProperty("Spring Boot"))));
}).withUserConfiguration(FooConfig.class);
contextRunner.run((context) -> {
ConfigurationPropertiesReportEndpoint endpoint = context
.getBean(ConfigurationPropertiesReportEndpoint.class);
ApplicationConfigurationProperties applicationProperties = endpoint.configurationProperties();
ConfigurationPropertiesBeanDescriptor descriptor = applicationProperties.getContexts().get(context.getId())
.getBeans().get("foo");
assertThat((Map<String, Object>) descriptor.getInputs().get("name")).containsEntry("value", "Spring Boot");
});
}

@Test
@SuppressWarnings("unchecked")
void endpointResponseUsesPlaceholderForComplexValueAsPropertyValue() throws IOException {
ApplicationContextRunner contextRunner = new ApplicationContextRunner().withInitializer((context) -> {
ConfigurableEnvironment environment = context.getEnvironment();
environment.getPropertySources().addFirst(new MapPropertySource("test",
Collections.singletonMap("foo.name", new ComplexProperty("Spring Boot"))));
}).withUserConfiguration(ComplexPropertyToStringConverter.class, FooConfig.class);
contextRunner.run((context) -> {
ConfigurationPropertiesReportEndpoint endpoint = context
.getBean(ConfigurationPropertiesReportEndpoint.class);
ApplicationConfigurationProperties applicationProperties = endpoint.configurationProperties();
ConfigurationPropertiesBeanDescriptor descriptor = applicationProperties.getContexts().get(context.getId())
.getBeans().get("foo");
assertThat((Map<String, Object>) descriptor.getInputs().get("name")).containsEntry("value",
"Complex property value " + ComplexProperty.class.getName());
});
}

@Configuration(proxyBeanMethods = false)
@EnableConfigurationProperties
static class Base {
Expand Down Expand Up @@ -518,4 +564,59 @@ HikariDataSource hikariDataSource() {

}

static class CharSequenceProperty implements CharSequence, InputStreamSource {

private final String value;

CharSequenceProperty(String value) {
this.value = value;
}

@Override
public int length() {
return this.value.length();
}

@Override
public char charAt(int index) {
return this.value.charAt(index);
}

@Override
public CharSequence subSequence(int start, int end) {
return this.value.subSequence(start, end);
}

@Override
public String toString() {
return this.value;
}

@Override
public InputStream getInputStream() throws IOException {
return new ByteArrayInputStream(this.value.getBytes());
}

}

static class ComplexProperty {

private final String value;

ComplexProperty(String value) {
this.value = value;
}

}

@ConfigurationPropertiesBinding
static class ComplexPropertyToStringConverter implements Converter<ComplexProperty, String> {

@Override
public String convert(ComplexProperty source) {
return source.value;
}

}

}

0 comments on commit d415913

Please sign in to comment.