Merge branch '2.0.x'

This commit is contained in:
Phillip Webb 2018-05-21 21:38:32 -07:00
commit c5f63c19a4
14 changed files with 73 additions and 63 deletions

View File

@ -59,7 +59,8 @@ public class ServletEndpointManagementContextConfiguration {
private final ApplicationContext context;
public WebMvcServletEndpointManagementContextConfiguration(ApplicationContext context) {
public WebMvcServletEndpointManagementContextConfiguration(
ApplicationContext context) {
this.context = context;
}
@ -67,8 +68,12 @@ public class ServletEndpointManagementContextConfiguration {
public ServletEndpointRegistrar servletEndpointRegistrar(
WebEndpointProperties properties,
ServletEndpointsSupplier servletEndpointsSupplier) {
DispatcherServletPathProvider servletPathProvider = this.context.getBean(DispatcherServletPathProvider.class);
String servletPath = (servletPathProvider.getServletPath().equals("/") ? "" : servletPathProvider.getServletPath());
DispatcherServletPathProvider servletPathProvider = this.context
.getBean(DispatcherServletPathProvider.class);
String servletPath = servletPathProvider.getServletPath();
if (servletPath.equals("/")) {
servletPath = "";
}
return new ServletEndpointRegistrar(servletPath + properties.getBasePath(),
servletEndpointsSupplier.getEndpoints());
}

View File

@ -30,13 +30,12 @@ import org.springframework.util.StringUtils;
/**
* {@link BeanPostProcessor} that configures RabbitMQ metrics. Such arrangement is
* necessary because a connection can be eagerly created and cached without a reference
* to a proper {@link MetricsCollector}.
* necessary because a connection can be eagerly created and cached without a reference to
* a proper {@link MetricsCollector}.
*
* @author Stephane Nicoll
*/
class RabbitConnectionFactoryMetricsPostProcessor
implements BeanPostProcessor, Ordered {
class RabbitConnectionFactoryMetricsPostProcessor implements BeanPostProcessor, Ordered {
private static final String CONNECTION_FACTORY_SUFFIX = "connectionFactory";

View File

@ -219,7 +219,8 @@ public final class EndpointRequest {
}
private String getEndpointId(Class<?> source) {
Endpoint annotation = AnnotatedElementUtils.getMergedAnnotation(source, Endpoint.class);
Endpoint annotation = AnnotatedElementUtils.getMergedAnnotation(source,
Endpoint.class);
Assert.state(annotation != null,
() -> "Class " + source + " is not annotated with @Endpoint");
return annotation.id();

View File

@ -238,7 +238,8 @@ public final class EndpointRequest {
}
private String getEndpointId(Class<?> source) {
Endpoint annotation = AnnotatedElementUtils.getMergedAnnotation(source, Endpoint.class);
Endpoint annotation = AnnotatedElementUtils.getMergedAnnotation(source,
Endpoint.class);
Assert.state(annotation != null,
() -> "Class " + source + " is not annotated with @Endpoint");
return annotation.id();

View File

@ -49,12 +49,11 @@ public class ServletEndpointManagementContextConfigurationTests {
@Test
public void contextShouldContainServletEndpointRegistrar() {
FilteredClassLoader classLoader = new FilteredClassLoader(
ResourceConfig.class);
FilteredClassLoader classLoader = new FilteredClassLoader(ResourceConfig.class);
this.contextRunner.withClassLoader(classLoader).run((context) -> {
assertThat(context)
.hasSingleBean(ServletEndpointRegistrar.class);
ServletEndpointRegistrar bean = context.getBean(ServletEndpointRegistrar.class);
assertThat(context).hasSingleBean(ServletEndpointRegistrar.class);
ServletEndpointRegistrar bean = context
.getBean(ServletEndpointRegistrar.class);
String basePath = (String) ReflectionTestUtils.getField(bean, "basePath");
assertThat(basePath).isEqualTo("/test/actuator");
});
@ -65,9 +64,9 @@ public class ServletEndpointManagementContextConfigurationTests {
FilteredClassLoader classLoader = new FilteredClassLoader(
DispatcherServlet.class);
this.contextRunner.withClassLoader(classLoader).run((context) -> {
assertThat(context)
.hasSingleBean(ServletEndpointRegistrar.class);
ServletEndpointRegistrar bean = context.getBean(ServletEndpointRegistrar.class);
assertThat(context).hasSingleBean(ServletEndpointRegistrar.class);
ServletEndpointRegistrar bean = context
.getBean(ServletEndpointRegistrar.class);
String basePath = (String) ReflectionTestUtils.getField(bean, "basePath");
assertThat(basePath).isEqualTo("/actuator");
});

View File

@ -72,7 +72,6 @@ public class EndpointMBean implements DynamicMBean {
this.operations = getOperations(endpoint);
}
private Map<String, JmxOperation> getOperations(ExposableJmxEndpoint endpoint) {
Map<String, JmxOperation> operations = new HashMap<>();
endpoint.getOperations()
@ -94,7 +93,8 @@ public class EndpointMBean implements DynamicMBean {
+ "' has no operation named " + actionName;
throw new ReflectionException(new IllegalArgumentException(message), message);
}
ClassLoader previousClassLoader = overrideThreadContextClassLoader(this.classLoader);
ClassLoader previousClassLoader = overrideThreadContextClassLoader(
this.classLoader);
try {
return invoke(operation, params);
}

View File

@ -33,8 +33,8 @@ public abstract class AbstractHealthAggregator implements HealthAggregator {
@Override
public final Health aggregate(Map<String, Health> healths) {
List<Status> statusCandidates = healths.values().stream()
.map(Health::getStatus).collect(Collectors.toList());
List<Status> statusCandidates = healths.values().stream().map(Health::getStatus)
.collect(Collectors.toList());
Status status = aggregateStatus(statusCandidates);
Map<String, Object> details = aggregateDetails(healths);
return new Health.Builder(status, details).build();

View File

@ -1,5 +1,5 @@
/*
* Copyright 2012-2017 the original author or authors.
* Copyright 2012-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.

View File

@ -1,5 +1,5 @@
/*
* Copyright 2012-2017 the original author or authors.
* Copyright 2012-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.
@ -64,26 +64,28 @@ public class FreeMarkerAutoConfiguration {
@PostConstruct
public void checkTemplateLocationExists() {
if (logger.isWarnEnabled()) {
if (this.properties.isCheckTemplateLocation()) {
TemplateLocation templatePathLocation = null;
List<TemplateLocation> locations = new ArrayList<>();
for (String templateLoaderPath : this.properties.getTemplateLoaderPath()) {
TemplateLocation location = new TemplateLocation(templateLoaderPath);
locations.add(location);
if (location.exists(this.applicationContext)) {
templatePathLocation = location;
break;
}
}
if (templatePathLocation == null) {
logger.warn("Cannot find template location(s): " + locations
+ " (please add some templates, "
+ "check your FreeMarker configuration, or set "
+ "spring.freemarker.checkTemplateLocation=false)");
}
if (logger.isWarnEnabled() && this.properties.isCheckTemplateLocation()) {
List<TemplateLocation> locations = getLocations();
if (locations.stream().noneMatch(this::locationExists)) {
logger.warn("Cannot find template location(s): " + locations
+ " (please add some templates, "
+ "check your FreeMarker configuration, or set "
+ "spring.freemarker.checkTemplateLocation=false)");
}
}
}
private List<TemplateLocation> getLocations() {
List<TemplateLocation> locations = new ArrayList<>();
for (String templateLoaderPath : this.properties.getTemplateLoaderPath()) {
TemplateLocation location = new TemplateLocation(templateLoaderPath);
locations.add(location);
}
return locations;
}
private boolean locationExists(TemplateLocation location) {
return location.exists(this.applicationContext);
}
}

View File

@ -51,14 +51,13 @@ public class QuartzDataSourceInitializerTests {
@Test
public void commentPrefixCanBeCustomized() {
this.contextRunner.withUserConfiguration(TestConfiguration.class)
.withPropertyValues(
"spring.quartz.jdbc.comment-prefix=##",
.withPropertyValues("spring.quartz.jdbc.comment-prefix=##",
"spring.quartz.jdbc.schema=classpath:org/springframework/boot/autoconfigure/quartz/tables_@@platform@@.sql")
.run((context) -> {
JdbcTemplate jdbcTemplate = context.getBean(JdbcTemplate.class);
assertThat(jdbcTemplate.queryForObject(
"SELECT COUNT(*) FROM QRTZ_TEST_TABLE", Integer.class))
.isEqualTo(0);
.isEqualTo(0);
});
}
@ -69,7 +68,8 @@ public class QuartzDataSourceInitializerTests {
@Bean
public QuartzDataSourceInitializer initializer(DataSource dataSource,
ResourceLoader resourceLoader, QuartzProperties properties) {
return new QuartzDataSourceInitializer(dataSource, resourceLoader, properties);
return new QuartzDataSourceInitializer(dataSource, resourceLoader,
properties);
}
}

View File

@ -107,8 +107,8 @@ public class LocalHostUriTemplateHandlerTests {
URI uri = URI.create("http://www.example.com");
given(uriTemplateHandler.expand("https://localhost:8080/", uriVariables))
.willReturn(uri);
LocalHostUriTemplateHandler handler = new LocalHostUriTemplateHandler(
environment, "https", uriTemplateHandler);
LocalHostUriTemplateHandler handler = new LocalHostUriTemplateHandler(environment,
"https", uriTemplateHandler);
assertThat(handler.expand("/", uriVariables)).isEqualTo(uri);
verify(uriTemplateHandler).expand("https://localhost:8080/", uriVariables);
}

View File

@ -18,7 +18,6 @@ package org.springframework.boot.context.properties.bind;
import java.lang.annotation.Annotation;
import java.util.Collection;
import java.util.Collections;
import java.util.List;
import java.util.TreeSet;
import java.util.function.Supplier;
@ -83,24 +82,26 @@ abstract class IndexedElementsBinder<T> extends AggregateBinder<T> {
ResolvableType aggregateType, ResolvableType elementType) {
ConfigurationProperty property = source.getConfigurationProperty(root);
if (property != null) {
Collection<Object> elements;
Object value = property.getValue();
if (value instanceof String && !StringUtils.hasText((String) value)) {
elements = Collections.emptyList();
}
else {
Object aggregate = convert(value, aggregateType, target.getAnnotations());
ResolvableType collectionType = ResolvableType
.forClassWithGenerics(collection.get().getClass(), elementType);
elements = convert(aggregate, collectionType);
}
collection.get().addAll(elements);
bindValue(target, collection.get(), aggregateType, elementType,
property.getValue());
}
else {
bindIndexed(source, root, elementBinder, collection, elementType);
}
}
private void bindValue(Bindable<?> target, Collection<Object> collection,
ResolvableType aggregateType, ResolvableType elementType, Object value) {
if (value instanceof String && !StringUtils.hasText((String) value)) {
return;
}
Object aggregate = convert(value, aggregateType, target.getAnnotations());
ResolvableType collectionType = ResolvableType
.forClassWithGenerics(collection.getClass(), elementType);
Collection<Object> elements = convert(aggregate, collectionType);
collection.addAll(elements);
}
private void bindIndexed(ConfigurationPropertySource source,
ConfigurationPropertyName root, AggregateElementBinder elementBinder,
IndexedCollectionSupplier collection, ResolvableType elementType) {

View File

@ -79,8 +79,10 @@ public class ServletContextInitializerBeans
this.initializers = new LinkedMultiValueMap<>();
addServletContextInitializerBeans(beanFactory);
addAdaptableBeans(beanFactory);
List<ServletContextInitializer> sortedInitializers = this.initializers.values().stream()
.flatMap(value -> value.stream().sorted(AnnotationAwareOrderComparator.INSTANCE))
List<ServletContextInitializer> sortedInitializers = this.initializers.values()
.stream()
.flatMap(value -> value.stream()
.sorted(AnnotationAwareOrderComparator.INSTANCE))
.collect(Collectors.toList());
this.sortedList = Collections.unmodifiableList(sortedInitializers);
}

View File

@ -1,5 +1,5 @@
/*
* Copyright 2012-2017 the original author or authors.
* Copyright 2012-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.