commit
						25f0b3482c
					
				| 
						 | 
				
			
			@ -35,7 +35,6 @@ import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
 | 
			
		|||
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
 | 
			
		||||
import org.springframework.boot.autoconfigure.condition.SpringBootCondition;
 | 
			
		||||
import org.springframework.boot.autoconfigure.jmx.JmxAutoConfiguration;
 | 
			
		||||
import org.springframework.boot.bind.RelaxedPropertyResolver;
 | 
			
		||||
import org.springframework.boot.context.properties.EnableConfigurationProperties;
 | 
			
		||||
import org.springframework.context.annotation.Bean;
 | 
			
		||||
import org.springframework.context.annotation.ConditionContext;
 | 
			
		||||
| 
						 | 
				
			
			@ -50,6 +49,7 @@ import org.springframework.util.StringUtils;
 | 
			
		|||
 *
 | 
			
		||||
 * @author Christian Dupuis
 | 
			
		||||
 * @author Andy Wilkinson
 | 
			
		||||
 * @author Madhura Bhave
 | 
			
		||||
 */
 | 
			
		||||
@Configuration
 | 
			
		||||
@Conditional(JmxEnabledCondition.class)
 | 
			
		||||
| 
						 | 
				
			
			@ -103,8 +103,10 @@ public class EndpointMBeanExportAutoConfiguration {
 | 
			
		|||
		@Override
 | 
			
		||||
		public ConditionOutcome getMatchOutcome(ConditionContext context,
 | 
			
		||||
				AnnotatedTypeMetadata metadata) {
 | 
			
		||||
			boolean jmxEnabled = isEnabled(context, "spring.jmx.");
 | 
			
		||||
			boolean jmxEndpointsEnabled = isEnabled(context, "endpoints.jmx.");
 | 
			
		||||
			boolean jmxEnabled = context.getEnvironment()
 | 
			
		||||
					.getProperty("spring.jmx.enabled", Boolean.class, true);
 | 
			
		||||
			boolean jmxEndpointsEnabled = context.getEnvironment()
 | 
			
		||||
					.getProperty("endpoints.jmx.enabled", Boolean.class, true);
 | 
			
		||||
			if (jmxEnabled && jmxEndpointsEnabled) {
 | 
			
		||||
				return ConditionOutcome.match(
 | 
			
		||||
						ConditionMessage.forCondition("JMX Enabled").found("properties")
 | 
			
		||||
| 
						 | 
				
			
			@ -114,12 +116,6 @@ public class EndpointMBeanExportAutoConfiguration {
 | 
			
		|||
					.because("spring.jmx.enabled or endpoints.jmx.enabled is not set"));
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		private boolean isEnabled(ConditionContext context, String prefix) {
 | 
			
		||||
			RelaxedPropertyResolver resolver = new RelaxedPropertyResolver(
 | 
			
		||||
					context.getEnvironment(), prefix);
 | 
			
		||||
			return resolver.getProperty("enabled", Boolean.class, true);
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -49,7 +49,6 @@ import org.springframework.boot.autoconfigure.web.ServerProperties;
 | 
			
		|||
import org.springframework.boot.autoconfigure.web.servlet.DispatcherServletAutoConfiguration;
 | 
			
		||||
import org.springframework.boot.autoconfigure.web.servlet.ServletWebServerFactoryAutoConfiguration;
 | 
			
		||||
import org.springframework.boot.autoconfigure.web.servlet.WebMvcAutoConfiguration;
 | 
			
		||||
import org.springframework.boot.bind.RelaxedPropertyResolver;
 | 
			
		||||
import org.springframework.boot.context.event.ApplicationFailedEvent;
 | 
			
		||||
import org.springframework.boot.context.properties.EnableConfigurationProperties;
 | 
			
		||||
import org.springframework.boot.web.servlet.context.AnnotationConfigServletWebServerApplicationContext;
 | 
			
		||||
| 
						 | 
				
			
			@ -89,6 +88,7 @@ import org.springframework.web.servlet.DispatcherServlet;
 | 
			
		|||
 * @author Johannes Edmeier
 | 
			
		||||
 * @author Eddú Meléndez
 | 
			
		||||
 * @author Venil Noronha
 | 
			
		||||
 * @author Madhura Bhave
 | 
			
		||||
 */
 | 
			
		||||
@Configuration
 | 
			
		||||
@ConditionalOnClass({ Servlet.class, DispatcherServlet.class })
 | 
			
		||||
| 
						 | 
				
			
			@ -133,9 +133,9 @@ public class EndpointWebMvcAutoConfiguration
 | 
			
		|||
	@Override
 | 
			
		||||
	public void afterSingletonsInstantiated() {
 | 
			
		||||
		ManagementServerPort managementPort = ManagementServerPort.DIFFERENT;
 | 
			
		||||
		Environment environment = this.applicationContext.getEnvironment();
 | 
			
		||||
		if (this.applicationContext instanceof WebApplicationContext) {
 | 
			
		||||
			managementPort = ManagementServerPort
 | 
			
		||||
					.get(this.applicationContext.getEnvironment());
 | 
			
		||||
			managementPort = ManagementServerPort.get(environment);
 | 
			
		||||
		}
 | 
			
		||||
		if (managementPort == ManagementServerPort.DIFFERENT) {
 | 
			
		||||
			if (this.applicationContext instanceof ServletWebServerApplicationContext
 | 
			
		||||
| 
						 | 
				
			
			@ -150,17 +150,14 @@ public class EndpointWebMvcAutoConfiguration
 | 
			
		|||
			}
 | 
			
		||||
		}
 | 
			
		||||
		if (managementPort == ManagementServerPort.SAME) {
 | 
			
		||||
			if (new RelaxedPropertyResolver(this.applicationContext.getEnvironment(),
 | 
			
		||||
					"management.ssl.").getProperty("enabled") != null) {
 | 
			
		||||
			if (environment.getProperty("management.ssl.enabled") != null) {
 | 
			
		||||
				throw new IllegalStateException(
 | 
			
		||||
						"Management-specific SSL cannot be configured as the management "
 | 
			
		||||
								+ "server is not listening on a separate port");
 | 
			
		||||
			}
 | 
			
		||||
			if (this.applicationContext
 | 
			
		||||
					.getEnvironment() instanceof ConfigurableEnvironment) {
 | 
			
		||||
			if (environment instanceof ConfigurableEnvironment) {
 | 
			
		||||
				addLocalManagementPortPropertyAlias(
 | 
			
		||||
						(ConfigurableEnvironment) this.applicationContext
 | 
			
		||||
								.getEnvironment());
 | 
			
		||||
						(ConfigurableEnvironment) environment);
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
| 
						 | 
				
			
			@ -356,9 +353,7 @@ public class EndpointWebMvcAutoConfiguration
 | 
			
		|||
		}
 | 
			
		||||
 | 
			
		||||
		private static Integer getPortProperty(Environment environment, String prefix) {
 | 
			
		||||
			RelaxedPropertyResolver resolver = new RelaxedPropertyResolver(environment,
 | 
			
		||||
					prefix);
 | 
			
		||||
			return resolver.getProperty("port", Integer.class);
 | 
			
		||||
			return environment.getProperty(prefix + "port", Integer.class);
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
	}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -47,7 +47,6 @@ import org.springframework.boot.autoconfigure.condition.ConditionOutcome;
 | 
			
		|||
import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
 | 
			
		||||
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
 | 
			
		||||
import org.springframework.boot.autoconfigure.condition.SpringBootCondition;
 | 
			
		||||
import org.springframework.boot.bind.RelaxedPropertyResolver;
 | 
			
		||||
import org.springframework.boot.context.properties.EnableConfigurationProperties;
 | 
			
		||||
import org.springframework.context.annotation.Bean;
 | 
			
		||||
import org.springframework.context.annotation.ConditionContext;
 | 
			
		||||
| 
						 | 
				
			
			@ -64,6 +63,7 @@ import org.springframework.web.cors.CorsConfiguration;
 | 
			
		|||
 * @author Dave Syer
 | 
			
		||||
 * @author Ben Hale
 | 
			
		||||
 * @author Vedran Pavic
 | 
			
		||||
 * @author Madhura Bhave
 | 
			
		||||
 * @since 1.3.0
 | 
			
		||||
 */
 | 
			
		||||
@ManagementContextConfiguration
 | 
			
		||||
| 
						 | 
				
			
			@ -225,8 +225,7 @@ public class EndpointWebMvcManagementContextConfiguration {
 | 
			
		|||
				return ConditionOutcome
 | 
			
		||||
						.match(message.found("logging.path").items(config));
 | 
			
		||||
			}
 | 
			
		||||
			config = new RelaxedPropertyResolver(environment, "endpoints.logfile.")
 | 
			
		||||
					.getProperty("external-file");
 | 
			
		||||
			config = environment.getProperty("endpoints.logfile.external-file");
 | 
			
		||||
			if (StringUtils.hasText(config)) {
 | 
			
		||||
				return ConditionOutcome.match(
 | 
			
		||||
						message.found("endpoints.logfile.external-file").items(config));
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -33,7 +33,6 @@ import org.springframework.boot.autoconfigure.condition.ConditionalOnWebApplicat
 | 
			
		|||
import org.springframework.boot.autoconfigure.condition.ConditionalOnWebApplication.Type;
 | 
			
		||||
import org.springframework.boot.autoconfigure.condition.SpringBootCondition;
 | 
			
		||||
import org.springframework.boot.autoconfigure.web.servlet.ServletWebServerFactoryAutoConfiguration;
 | 
			
		||||
import org.springframework.boot.bind.RelaxedPropertyResolver;
 | 
			
		||||
import org.springframework.boot.context.properties.EnableConfigurationProperties;
 | 
			
		||||
import org.springframework.context.annotation.Bean;
 | 
			
		||||
import org.springframework.context.annotation.ConditionContext;
 | 
			
		||||
| 
						 | 
				
			
			@ -60,6 +59,7 @@ import org.springframework.web.servlet.mvc.ServletWrappingController;
 | 
			
		|||
 * @author Christian Dupuis
 | 
			
		||||
 * @author Dave Syer
 | 
			
		||||
 * @author Andy Wilkinson
 | 
			
		||||
 * @author Madhura Bhave
 | 
			
		||||
 */
 | 
			
		||||
@Configuration
 | 
			
		||||
@ConditionalOnWebApplication(type = Type.SERVLET)
 | 
			
		||||
| 
						 | 
				
			
			@ -108,9 +108,8 @@ public class JolokiaAutoConfiguration {
 | 
			
		|||
 | 
			
		||||
		private boolean isEnabled(ConditionContext context, String prefix,
 | 
			
		||||
				boolean defaultValue) {
 | 
			
		||||
			RelaxedPropertyResolver resolver = new RelaxedPropertyResolver(
 | 
			
		||||
					context.getEnvironment(), prefix);
 | 
			
		||||
			return resolver.getProperty("enabled", Boolean.class, defaultValue);
 | 
			
		||||
			return context.getEnvironment().getProperty(prefix + "enabled", Boolean.class,
 | 
			
		||||
					defaultValue);
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
	}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,5 +1,5 @@
 | 
			
		|||
/*
 | 
			
		||||
 * Copyright 2012-2016 the original author or authors.
 | 
			
		||||
 * Copyright 2012-2017 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.
 | 
			
		||||
| 
						 | 
				
			
			@ -21,9 +21,9 @@ import java.lang.annotation.Annotation;
 | 
			
		|||
import org.springframework.boot.autoconfigure.condition.ConditionMessage;
 | 
			
		||||
import org.springframework.boot.autoconfigure.condition.ConditionOutcome;
 | 
			
		||||
import org.springframework.boot.autoconfigure.condition.SpringBootCondition;
 | 
			
		||||
import org.springframework.boot.bind.RelaxedPropertyResolver;
 | 
			
		||||
import org.springframework.context.annotation.ConditionContext;
 | 
			
		||||
import org.springframework.core.annotation.AnnotationAttributes;
 | 
			
		||||
import org.springframework.core.env.Environment;
 | 
			
		||||
import org.springframework.core.type.AnnotatedTypeMetadata;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
| 
						 | 
				
			
			@ -31,6 +31,7 @@ import org.springframework.core.type.AnnotatedTypeMetadata;
 | 
			
		|||
 * {@code defaults} name or individually via the name of the element.
 | 
			
		||||
 *
 | 
			
		||||
 * @author Stephane Nicoll
 | 
			
		||||
 * @author Madhura Bhave
 | 
			
		||||
 */
 | 
			
		||||
abstract class OnEnabledEndpointElementCondition extends SpringBootCondition {
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -59,10 +60,10 @@ abstract class OnEnabledEndpointElementCondition extends SpringBootCondition {
 | 
			
		|||
 | 
			
		||||
	protected ConditionOutcome getEndpointOutcome(ConditionContext context,
 | 
			
		||||
			String endpointName) {
 | 
			
		||||
		RelaxedPropertyResolver resolver = new RelaxedPropertyResolver(
 | 
			
		||||
				context.getEnvironment(), this.prefix + endpointName + ".");
 | 
			
		||||
		if (resolver.containsProperty("enabled")) {
 | 
			
		||||
			boolean match = resolver.getProperty("enabled", Boolean.class, true);
 | 
			
		||||
		Environment environment = context.getEnvironment();
 | 
			
		||||
		String enabledProperty = this.prefix + endpointName + ".enabled";
 | 
			
		||||
		if (environment.containsProperty(enabledProperty)) {
 | 
			
		||||
			boolean match = environment.getProperty(enabledProperty, Boolean.class, true);
 | 
			
		||||
			return new ConditionOutcome(match,
 | 
			
		||||
					ConditionMessage.forCondition(this.annotationType).because(
 | 
			
		||||
							this.prefix + endpointName + ".enabled is " + match));
 | 
			
		||||
| 
						 | 
				
			
			@ -71,9 +72,8 @@ abstract class OnEnabledEndpointElementCondition extends SpringBootCondition {
 | 
			
		|||
	}
 | 
			
		||||
 | 
			
		||||
	protected ConditionOutcome getDefaultEndpointsOutcome(ConditionContext context) {
 | 
			
		||||
		RelaxedPropertyResolver resolver = new RelaxedPropertyResolver(
 | 
			
		||||
				context.getEnvironment(), this.prefix + "defaults.");
 | 
			
		||||
		boolean match = Boolean.valueOf(resolver.getProperty("enabled", "true"));
 | 
			
		||||
		boolean match = Boolean.valueOf(context.getEnvironment()
 | 
			
		||||
				.getProperty(this.prefix + "defaults.enabled", "true"));
 | 
			
		||||
		return new ConditionOutcome(match,
 | 
			
		||||
				ConditionMessage.forCondition(this.annotationType).because(
 | 
			
		||||
						this.prefix + "defaults.enabled is considered " + match));
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -30,7 +30,6 @@ import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
 | 
			
		|||
import org.springframework.boot.autoconfigure.condition.ConditionalOnCloudPlatform;
 | 
			
		||||
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
 | 
			
		||||
import org.springframework.boot.autoconfigure.security.IgnoredRequestCustomizer;
 | 
			
		||||
import org.springframework.boot.bind.RelaxedPropertyResolver;
 | 
			
		||||
import org.springframework.boot.cloud.CloudPlatform;
 | 
			
		||||
import org.springframework.boot.web.client.RestTemplateBuilder;
 | 
			
		||||
import org.springframework.context.annotation.Bean;
 | 
			
		||||
| 
						 | 
				
			
			@ -84,11 +83,9 @@ public class CloudFoundryActuatorAutoConfiguration {
 | 
			
		|||
 | 
			
		||||
	private CloudFoundrySecurityService getCloudFoundrySecurityService(
 | 
			
		||||
			RestTemplateBuilder restTemplateBuilder, Environment environment) {
 | 
			
		||||
		RelaxedPropertyResolver cloudFoundryProperties = new RelaxedPropertyResolver(
 | 
			
		||||
				environment, "management.cloudfoundry.");
 | 
			
		||||
		String cloudControllerUrl = environment.getProperty("vcap.application.cf_api");
 | 
			
		||||
		boolean skipSslValidation = cloudFoundryProperties
 | 
			
		||||
				.getProperty("skip-ssl-validation", Boolean.class, false);
 | 
			
		||||
		boolean skipSslValidation = environment.getProperty(
 | 
			
		||||
				"management.cloudfoundry.skip-ssl-validation", Boolean.class, false);
 | 
			
		||||
		return cloudControllerUrl == null ? null
 | 
			
		||||
				: new CloudFoundrySecurityService(restTemplateBuilder, cloudControllerUrl,
 | 
			
		||||
						skipSslValidation);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,5 +1,5 @@
 | 
			
		|||
/*
 | 
			
		||||
 * Copyright 2012-2016 the original author or authors.
 | 
			
		||||
 * Copyright 2012-2017 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.
 | 
			
		||||
| 
						 | 
				
			
			@ -19,16 +19,17 @@ package org.springframework.boot.actuate.condition;
 | 
			
		|||
import org.springframework.boot.autoconfigure.condition.ConditionMessage;
 | 
			
		||||
import org.springframework.boot.autoconfigure.condition.ConditionOutcome;
 | 
			
		||||
import org.springframework.boot.autoconfigure.condition.SpringBootCondition;
 | 
			
		||||
import org.springframework.boot.bind.RelaxedPropertyResolver;
 | 
			
		||||
import org.springframework.context.annotation.Condition;
 | 
			
		||||
import org.springframework.context.annotation.ConditionContext;
 | 
			
		||||
import org.springframework.core.annotation.AnnotationAttributes;
 | 
			
		||||
import org.springframework.core.env.Environment;
 | 
			
		||||
import org.springframework.core.type.AnnotatedTypeMetadata;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * {@link Condition} that checks whether or not an endpoint is enabled.
 | 
			
		||||
 *
 | 
			
		||||
 * @author Andy Wilkinson
 | 
			
		||||
 * @author Madhura Bhave
 | 
			
		||||
 */
 | 
			
		||||
class OnEnabledEndpointCondition extends SpringBootCondition {
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -49,10 +50,10 @@ class OnEnabledEndpointCondition extends SpringBootCondition {
 | 
			
		|||
 | 
			
		||||
	private ConditionOutcome determineEndpointOutcome(String endpointName,
 | 
			
		||||
			boolean enabledByDefault, ConditionContext context) {
 | 
			
		||||
		RelaxedPropertyResolver resolver = new RelaxedPropertyResolver(
 | 
			
		||||
				context.getEnvironment(), "endpoints." + endpointName + ".");
 | 
			
		||||
		if (resolver.containsProperty("enabled") || !enabledByDefault) {
 | 
			
		||||
			boolean match = resolver.getProperty("enabled", Boolean.class,
 | 
			
		||||
		Environment environment = context.getEnvironment();
 | 
			
		||||
		String enabledProperty = "endpoints." + endpointName + ".enabled";
 | 
			
		||||
		if (environment.containsProperty(enabledProperty) || !enabledByDefault) {
 | 
			
		||||
			boolean match = environment.getProperty(enabledProperty, Boolean.class,
 | 
			
		||||
					enabledByDefault);
 | 
			
		||||
			ConditionMessage message = ConditionMessage
 | 
			
		||||
					.forCondition(ConditionalOnEnabledEndpoint.class,
 | 
			
		||||
| 
						 | 
				
			
			@ -64,9 +65,8 @@ class OnEnabledEndpointCondition extends SpringBootCondition {
 | 
			
		|||
	}
 | 
			
		||||
 | 
			
		||||
	private ConditionOutcome determineAllEndpointsOutcome(ConditionContext context) {
 | 
			
		||||
		RelaxedPropertyResolver resolver = new RelaxedPropertyResolver(
 | 
			
		||||
				context.getEnvironment(), "endpoints.");
 | 
			
		||||
		boolean match = Boolean.valueOf(resolver.getProperty("enabled", "true"));
 | 
			
		||||
		boolean match = Boolean.valueOf(
 | 
			
		||||
				context.getEnvironment().getProperty("endpoints.enabled", "true"));
 | 
			
		||||
		ConditionMessage message = ConditionMessage
 | 
			
		||||
				.forCondition(ConditionalOnEnabledEndpoint.class)
 | 
			
		||||
				.because("All endpoints are " + (match ? "enabled" : "disabled")
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -17,6 +17,7 @@
 | 
			
		|||
package org.springframework.boot.actuate.endpoint.mvc;
 | 
			
		||||
 | 
			
		||||
import java.security.Principal;
 | 
			
		||||
import java.util.ArrayList;
 | 
			
		||||
import java.util.Arrays;
 | 
			
		||||
import java.util.HashMap;
 | 
			
		||||
import java.util.List;
 | 
			
		||||
| 
						 | 
				
			
			@ -27,18 +28,13 @@ import javax.servlet.http.HttpServletRequest;
 | 
			
		|||
import org.springframework.boot.actuate.endpoint.HealthEndpoint;
 | 
			
		||||
import org.springframework.boot.actuate.health.Health;
 | 
			
		||||
import org.springframework.boot.actuate.health.Status;
 | 
			
		||||
import org.springframework.boot.bind.RelaxedNames;
 | 
			
		||||
import org.springframework.boot.bind.RelaxedPropertyResolver;
 | 
			
		||||
import org.springframework.boot.context.properties.ConfigurationProperties;
 | 
			
		||||
import org.springframework.context.EnvironmentAware;
 | 
			
		||||
import org.springframework.core.env.Environment;
 | 
			
		||||
import org.springframework.http.HttpStatus;
 | 
			
		||||
import org.springframework.http.ResponseEntity;
 | 
			
		||||
import org.springframework.security.core.Authentication;
 | 
			
		||||
import org.springframework.security.core.GrantedAuthority;
 | 
			
		||||
import org.springframework.util.Assert;
 | 
			
		||||
import org.springframework.util.ClassUtils;
 | 
			
		||||
import org.springframework.util.StringUtils;
 | 
			
		||||
import org.springframework.web.bind.annotation.ResponseBody;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
| 
						 | 
				
			
			@ -53,8 +49,9 @@ import org.springframework.web.bind.annotation.ResponseBody;
 | 
			
		|||
 * @since 1.1.0
 | 
			
		||||
 */
 | 
			
		||||
@ConfigurationProperties(prefix = "endpoints.health")
 | 
			
		||||
public class HealthMvcEndpoint extends AbstractEndpointMvcAdapter<HealthEndpoint>
 | 
			
		||||
		implements EnvironmentAware {
 | 
			
		||||
public class HealthMvcEndpoint extends AbstractEndpointMvcAdapter<HealthEndpoint> {
 | 
			
		||||
 | 
			
		||||
	private static final List<String> DEFAULT_ROLES = Arrays.asList("ROLE_ACTUATOR");
 | 
			
		||||
 | 
			
		||||
	private final boolean secure;
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -62,8 +59,6 @@ public class HealthMvcEndpoint extends AbstractEndpointMvcAdapter<HealthEndpoint
 | 
			
		|||
 | 
			
		||||
	private Map<String, HttpStatus> statusMapping = new HashMap<>();
 | 
			
		||||
 | 
			
		||||
	private RelaxedPropertyResolver securityPropertyResolver;
 | 
			
		||||
 | 
			
		||||
	private long lastAccess = 0;
 | 
			
		||||
 | 
			
		||||
	private Health cached;
 | 
			
		||||
| 
						 | 
				
			
			@ -73,15 +68,16 @@ public class HealthMvcEndpoint extends AbstractEndpointMvcAdapter<HealthEndpoint
 | 
			
		|||
	}
 | 
			
		||||
 | 
			
		||||
	public HealthMvcEndpoint(HealthEndpoint delegate, boolean secure) {
 | 
			
		||||
		this(delegate, secure, null);
 | 
			
		||||
		this(delegate, secure, new ArrayList<>(DEFAULT_ROLES));
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	public HealthMvcEndpoint(HealthEndpoint delegate, boolean secure,
 | 
			
		||||
			List<String> roles) {
 | 
			
		||||
		super(delegate);
 | 
			
		||||
		Assert.notNull(roles, "Roles must not be null");
 | 
			
		||||
		this.secure = secure;
 | 
			
		||||
		setupDefaultStatusMapping();
 | 
			
		||||
		this.roles = roles;
 | 
			
		||||
		setupDefaultStatusMapping();
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	private void setupDefaultStatusMapping() {
 | 
			
		||||
| 
						 | 
				
			
			@ -89,12 +85,6 @@ public class HealthMvcEndpoint extends AbstractEndpointMvcAdapter<HealthEndpoint
 | 
			
		|||
		addStatusMapping(Status.OUT_OF_SERVICE, HttpStatus.SERVICE_UNAVAILABLE);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	@Override
 | 
			
		||||
	public void setEnvironment(Environment environment) {
 | 
			
		||||
		this.securityPropertyResolver = new RelaxedPropertyResolver(environment,
 | 
			
		||||
				"management.security.");
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	/**
 | 
			
		||||
	 * Set specific status mappings.
 | 
			
		||||
	 * @param statusMapping a map of status code to {@link HttpStatus}
 | 
			
		||||
| 
						 | 
				
			
			@ -151,19 +141,28 @@ public class HealthMvcEndpoint extends AbstractEndpointMvcAdapter<HealthEndpoint
 | 
			
		|||
	}
 | 
			
		||||
 | 
			
		||||
	private HttpStatus getStatus(Health health) {
 | 
			
		||||
		String code = health.getStatus().getCode();
 | 
			
		||||
		String code = getUniformValue(health.getStatus().getCode());
 | 
			
		||||
		if (code != null) {
 | 
			
		||||
			code = code.toLowerCase().replace('_', '-');
 | 
			
		||||
			for (String candidate : RelaxedNames.forCamelCase(code)) {
 | 
			
		||||
				HttpStatus status = this.statusMapping.get(candidate);
 | 
			
		||||
				if (status != null) {
 | 
			
		||||
					return status;
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
			return this.statusMapping.keySet().stream()
 | 
			
		||||
					.filter((key) -> code.equals(getUniformValue(key)))
 | 
			
		||||
					.map(this.statusMapping::get).findFirst().orElse(null);
 | 
			
		||||
		}
 | 
			
		||||
		return null;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	private String getUniformValue(String code) {
 | 
			
		||||
		if (code == null) {
 | 
			
		||||
			return null;
 | 
			
		||||
		}
 | 
			
		||||
		StringBuilder builder = new StringBuilder();
 | 
			
		||||
		for (char ch : code.toCharArray()) {
 | 
			
		||||
			if (Character.isAlphabetic(ch) || Character.isDigit(ch)) {
 | 
			
		||||
				builder.append(Character.toLowerCase(ch));
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
		return builder.toString();
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	private Health getHealth(HttpServletRequest request, Principal principal) {
 | 
			
		||||
		long accessTime = System.currentTimeMillis();
 | 
			
		||||
		if (isCacheStale(accessTime)) {
 | 
			
		||||
| 
						 | 
				
			
			@ -207,13 +206,7 @@ public class HealthMvcEndpoint extends AbstractEndpointMvcAdapter<HealthEndpoint
 | 
			
		|||
	}
 | 
			
		||||
 | 
			
		||||
	private List<String> getRoles() {
 | 
			
		||||
		if (this.roles != null) {
 | 
			
		||||
			return this.roles;
 | 
			
		||||
		}
 | 
			
		||||
		String[] roles = StringUtils.commaDelimitedListToStringArray(
 | 
			
		||||
				this.securityPropertyResolver.getProperty("roles", "ROLE_ACTUATOR"));
 | 
			
		||||
		roles = StringUtils.trimArrayElements(roles);
 | 
			
		||||
		return Arrays.asList(roles);
 | 
			
		||||
		return this.roles;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	private boolean isSpringSecurityAuthentication(Principal principal) {
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,5 +1,5 @@
 | 
			
		|||
/*
 | 
			
		||||
 * Copyright 2012-2016 the original author or authors.
 | 
			
		||||
 * Copyright 2012-2017 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.
 | 
			
		||||
| 
						 | 
				
			
			@ -16,7 +16,10 @@
 | 
			
		|||
 | 
			
		||||
package org.springframework.boot.actuate.info;
 | 
			
		||||
 | 
			
		||||
import org.springframework.boot.bind.PropertySourcesBinder;
 | 
			
		||||
import java.util.Map;
 | 
			
		||||
 | 
			
		||||
import org.springframework.boot.context.properties.bind.Bindable;
 | 
			
		||||
import org.springframework.boot.context.properties.bind.Binder;
 | 
			
		||||
import org.springframework.core.env.ConfigurableEnvironment;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
| 
						 | 
				
			
			@ -24,19 +27,24 @@ import org.springframework.core.env.ConfigurableEnvironment;
 | 
			
		|||
 *
 | 
			
		||||
 * @author Meang Akira Tanaka
 | 
			
		||||
 * @author Stephane Nicoll
 | 
			
		||||
 * @author Madhura Bhave
 | 
			
		||||
 * @since 1.4.0
 | 
			
		||||
 */
 | 
			
		||||
public class EnvironmentInfoContributor implements InfoContributor {
 | 
			
		||||
 | 
			
		||||
	private final PropertySourcesBinder binder;
 | 
			
		||||
	private static final Bindable<Map<String, Object>> STRING_OBJECT_MAP = Bindable
 | 
			
		||||
			.mapOf(String.class, Object.class);
 | 
			
		||||
 | 
			
		||||
	private final ConfigurableEnvironment environment;
 | 
			
		||||
 | 
			
		||||
	public EnvironmentInfoContributor(ConfigurableEnvironment environment) {
 | 
			
		||||
		this.binder = new PropertySourcesBinder(environment);
 | 
			
		||||
		this.environment = environment;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	@Override
 | 
			
		||||
	public void contribute(Info.Builder builder) {
 | 
			
		||||
		builder.withDetails(this.binder.extractAll("info"));
 | 
			
		||||
		Binder binder = Binder.get(this.environment);
 | 
			
		||||
		binder.bind("info", STRING_OBJECT_MAP).ifBound(builder::withDetails);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,5 +1,5 @@
 | 
			
		|||
/*
 | 
			
		||||
 * Copyright 2012-2016 the original author or authors.
 | 
			
		||||
 * Copyright 2012-2017 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.
 | 
			
		||||
| 
						 | 
				
			
			@ -17,11 +17,15 @@
 | 
			
		|||
package org.springframework.boot.actuate.info;
 | 
			
		||||
 | 
			
		||||
import java.util.Collections;
 | 
			
		||||
import java.util.LinkedHashMap;
 | 
			
		||||
import java.util.Map;
 | 
			
		||||
import java.util.Properties;
 | 
			
		||||
 | 
			
		||||
import org.springframework.boot.bind.PropertySourcesBinder;
 | 
			
		||||
import org.springframework.boot.context.properties.bind.Bindable;
 | 
			
		||||
import org.springframework.boot.context.properties.bind.Binder;
 | 
			
		||||
import org.springframework.boot.context.properties.source.ConfigurationPropertySources;
 | 
			
		||||
import org.springframework.boot.info.InfoProperties;
 | 
			
		||||
import org.springframework.core.env.MutablePropertySources;
 | 
			
		||||
import org.springframework.core.env.PropertySource;
 | 
			
		||||
import org.springframework.util.StringUtils;
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -30,11 +34,15 @@ import org.springframework.util.StringUtils;
 | 
			
		|||
 *
 | 
			
		||||
 * @param <T> the type of the {@link InfoProperties} to expose
 | 
			
		||||
 * @author Stephane Nicoll
 | 
			
		||||
 * @author Madhura Bhave
 | 
			
		||||
 * @since 1.4.0
 | 
			
		||||
 */
 | 
			
		||||
public abstract class InfoPropertiesInfoContributor<T extends InfoProperties>
 | 
			
		||||
		implements InfoContributor {
 | 
			
		||||
 | 
			
		||||
	private static final Bindable<Map<String, Object>> STRING_OBJECT_MAP = Bindable
 | 
			
		||||
			.mapOf(String.class, Object.class);
 | 
			
		||||
 | 
			
		||||
	private final T properties;
 | 
			
		||||
 | 
			
		||||
	private final Mode mode;
 | 
			
		||||
| 
						 | 
				
			
			@ -85,7 +93,10 @@ public abstract class InfoPropertiesInfoContributor<T extends InfoProperties>
 | 
			
		|||
	 * @return the raw content
 | 
			
		||||
	 */
 | 
			
		||||
	protected Map<String, Object> extractContent(PropertySource<?> propertySource) {
 | 
			
		||||
		return new PropertySourcesBinder(propertySource).extractAll("");
 | 
			
		||||
		MutablePropertySources sources = new MutablePropertySources();
 | 
			
		||||
		sources.addFirst(propertySource);
 | 
			
		||||
		return new Binder(ConfigurationPropertySources.get(sources))
 | 
			
		||||
				.bind("", STRING_OBJECT_MAP).orElseGet(LinkedHashMap::new);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	/**
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -21,7 +21,6 @@ import java.util.Collection;
 | 
			
		|||
import java.util.Collections;
 | 
			
		||||
import java.util.LinkedHashMap;
 | 
			
		||||
import java.util.Map;
 | 
			
		||||
import java.util.Properties;
 | 
			
		||||
 | 
			
		||||
import javax.sql.DataSource;
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -55,14 +54,16 @@ import org.springframework.boot.autoconfigure.info.ProjectInfoProperties;
 | 
			
		|||
import org.springframework.boot.autoconfigure.jdbc.DataSourceBuilder;
 | 
			
		||||
import org.springframework.boot.autoconfigure.jdbc.EmbeddedDataSourceConfiguration;
 | 
			
		||||
import org.springframework.boot.autoconfigure.liquibase.LiquibaseAutoConfiguration;
 | 
			
		||||
import org.springframework.boot.bind.PropertySourcesBinder;
 | 
			
		||||
import org.springframework.boot.context.properties.bind.Bindable;
 | 
			
		||||
import org.springframework.boot.context.properties.bind.Binder;
 | 
			
		||||
import org.springframework.boot.context.properties.source.MapConfigurationPropertySource;
 | 
			
		||||
import org.springframework.boot.logging.LoggingSystem;
 | 
			
		||||
import org.springframework.boot.test.util.EnvironmentTestUtils;
 | 
			
		||||
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
 | 
			
		||||
import org.springframework.context.annotation.Bean;
 | 
			
		||||
import org.springframework.context.annotation.Configuration;
 | 
			
		||||
import org.springframework.core.ResolvableType;
 | 
			
		||||
import org.springframework.core.annotation.Order;
 | 
			
		||||
import org.springframework.core.env.PropertiesPropertySource;
 | 
			
		||||
import org.springframework.core.io.Resource;
 | 
			
		||||
import org.springframework.core.io.support.PropertiesLoaderUtils;
 | 
			
		||||
import org.springframework.validation.BindException;
 | 
			
		||||
| 
						 | 
				
			
			@ -310,17 +311,19 @@ public class EndpointAutoConfigurationTests {
 | 
			
		|||
 | 
			
		||||
		private static class GitFullInfoContributor implements InfoContributor {
 | 
			
		||||
 | 
			
		||||
			private static final ResolvableType STRING_OBJECT_MAP = ResolvableType
 | 
			
		||||
					.forClassWithGenerics(Map.class, String.class, Object.class);
 | 
			
		||||
 | 
			
		||||
			private Map<String, Object> content = new LinkedHashMap<>();
 | 
			
		||||
 | 
			
		||||
			GitFullInfoContributor(Resource location) throws BindException, IOException {
 | 
			
		||||
				if (location.exists()) {
 | 
			
		||||
					Properties gitInfoProperties = PropertiesLoaderUtils
 | 
			
		||||
							.loadProperties(location);
 | 
			
		||||
					PropertiesPropertySource gitPropertySource = new PropertiesPropertySource(
 | 
			
		||||
							"git", gitInfoProperties);
 | 
			
		||||
					this.content = new PropertySourcesBinder(gitPropertySource)
 | 
			
		||||
							.extractAll("git");
 | 
			
		||||
				if (!location.exists()) {
 | 
			
		||||
					return;
 | 
			
		||||
				}
 | 
			
		||||
				MapConfigurationPropertySource source = new MapConfigurationPropertySource(
 | 
			
		||||
						PropertiesLoaderUtils.loadProperties(location));
 | 
			
		||||
				new Binder(source).bind("info",
 | 
			
		||||
						Bindable.of(STRING_OBJECT_MAP).withExistingValue(this.content));
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			@Override
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -62,6 +62,7 @@ import org.springframework.boot.autoconfigure.web.servlet.ServletWebServerFactor
 | 
			
		|||
import org.springframework.boot.autoconfigure.web.servlet.WebMvcAutoConfiguration;
 | 
			
		||||
import org.springframework.boot.autoconfigure.web.servlet.error.ErrorMvcAutoConfiguration;
 | 
			
		||||
import org.springframework.boot.context.event.ApplicationFailedEvent;
 | 
			
		||||
import org.springframework.boot.context.properties.source.ConfigurationPropertySources;
 | 
			
		||||
import org.springframework.boot.logging.LoggingSystem;
 | 
			
		||||
import org.springframework.boot.test.util.EnvironmentTestUtils;
 | 
			
		||||
import org.springframework.boot.testutil.Matched;
 | 
			
		||||
| 
						 | 
				
			
			@ -357,7 +358,7 @@ public class EndpointWebMvcAutoConfigurationTests {
 | 
			
		|||
	@Test
 | 
			
		||||
	public void contextPath() throws Exception {
 | 
			
		||||
		EnvironmentTestUtils.addEnvironment(this.applicationContext,
 | 
			
		||||
				"management.contextPath:/test", "management.security.enabled:false");
 | 
			
		||||
				"management.context-path:/test", "management.security.enabled:false");
 | 
			
		||||
		this.applicationContext.register(RootConfig.class, EndpointConfig.class,
 | 
			
		||||
				PropertyPlaceholderAutoConfiguration.class,
 | 
			
		||||
				JacksonAutoConfiguration.class,
 | 
			
		||||
| 
						 | 
				
			
			@ -448,7 +449,7 @@ public class EndpointWebMvcAutoConfigurationTests {
 | 
			
		|||
		this.applicationContext.register(RootConfig.class, BaseConfiguration.class,
 | 
			
		||||
				EndpointWebMvcAutoConfiguration.class);
 | 
			
		||||
		EnvironmentTestUtils.addEnvironment(this.applicationContext,
 | 
			
		||||
				"ENDPOINTS_ENABLED:false");
 | 
			
		||||
				"endpoints.enabled:false");
 | 
			
		||||
		this.applicationContext.refresh();
 | 
			
		||||
		assertThat(this.applicationContext.getBeansOfType(MvcEndpoint.class)).isEmpty();
 | 
			
		||||
	}
 | 
			
		||||
| 
						 | 
				
			
			@ -646,9 +647,10 @@ public class EndpointWebMvcAutoConfigurationTests {
 | 
			
		|||
			throws Exception {
 | 
			
		||||
		this.applicationContext.register(LoggingConfig.class, RootConfig.class,
 | 
			
		||||
				BaseConfiguration.class, EndpointWebMvcAutoConfiguration.class);
 | 
			
		||||
		ConfigurationPropertySources.attach(this.applicationContext.getEnvironment());
 | 
			
		||||
		EnvironmentTestUtils.addEnvironment(this.applicationContext,
 | 
			
		||||
				"endpoints.enabled:false",
 | 
			
		||||
				String.format("endpoints_%s_enabled:true", name));
 | 
			
		||||
				String.format("endpoints.%s.enabled:true", name));
 | 
			
		||||
		this.applicationContext.refresh();
 | 
			
		||||
		assertThat(this.applicationContext.getBeansOfType(type)).hasSize(1);
 | 
			
		||||
	}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -34,6 +34,7 @@ import org.springframework.boot.autoconfigure.security.IgnoredRequestCustomizer;
 | 
			
		|||
import org.springframework.boot.autoconfigure.security.SecurityAutoConfiguration;
 | 
			
		||||
import org.springframework.boot.autoconfigure.web.client.RestTemplateAutoConfiguration;
 | 
			
		||||
import org.springframework.boot.autoconfigure.web.servlet.WebMvcAutoConfiguration;
 | 
			
		||||
import org.springframework.boot.context.properties.source.ConfigurationPropertySources;
 | 
			
		||||
import org.springframework.boot.test.util.EnvironmentTestUtils;
 | 
			
		||||
import org.springframework.http.HttpMethod;
 | 
			
		||||
import org.springframework.mock.web.MockHttpServletRequest;
 | 
			
		||||
| 
						 | 
				
			
			@ -120,6 +121,7 @@ public class CloudFoundryActuatorAutoConfigurationTests {
 | 
			
		|||
	public void skipSslValidation() throws Exception {
 | 
			
		||||
		EnvironmentTestUtils.addEnvironment(this.context,
 | 
			
		||||
				"management.cloudfoundry.skipSslValidation:true");
 | 
			
		||||
		ConfigurationPropertySources.attach(this.context.getEnvironment());
 | 
			
		||||
		this.context.refresh();
 | 
			
		||||
		CloudFoundryEndpointHandlerMapping handlerMapping = getHandlerMapping();
 | 
			
		||||
		Object interceptor = ReflectionTestUtils.getField(handlerMapping,
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -16,8 +16,10 @@
 | 
			
		|||
 | 
			
		||||
package org.springframework.boot.actuate.endpoint.mvc;
 | 
			
		||||
 | 
			
		||||
import java.util.ArrayList;
 | 
			
		||||
import java.util.Arrays;
 | 
			
		||||
import java.util.Collections;
 | 
			
		||||
import java.util.List;
 | 
			
		||||
import java.util.Set;
 | 
			
		||||
 | 
			
		||||
import javax.servlet.http.HttpServletRequest;
 | 
			
		||||
| 
						 | 
				
			
			@ -28,11 +30,8 @@ import org.junit.Test;
 | 
			
		|||
import org.springframework.boot.actuate.endpoint.HealthEndpoint;
 | 
			
		||||
import org.springframework.boot.actuate.health.Health;
 | 
			
		||||
import org.springframework.boot.actuate.health.Status;
 | 
			
		||||
import org.springframework.core.env.MapPropertySource;
 | 
			
		||||
import org.springframework.core.env.PropertySource;
 | 
			
		||||
import org.springframework.http.HttpStatus;
 | 
			
		||||
import org.springframework.http.ResponseEntity;
 | 
			
		||||
import org.springframework.mock.env.MockEnvironment;
 | 
			
		||||
import org.springframework.mock.web.MockHttpServletRequest;
 | 
			
		||||
import org.springframework.mock.web.MockServletContext;
 | 
			
		||||
import org.springframework.security.core.Authentication;
 | 
			
		||||
| 
						 | 
				
			
			@ -54,9 +53,8 @@ import static org.mockito.Mockito.mock;
 | 
			
		|||
 */
 | 
			
		||||
public class HealthMvcEndpointTests {
 | 
			
		||||
 | 
			
		||||
	private static final PropertySource<?> SECURITY_ROLES = new MapPropertySource("test",
 | 
			
		||||
			Collections.<String, Object>singletonMap("management.security.roles",
 | 
			
		||||
					"HERO"));
 | 
			
		||||
	private static final List<String> SECURITY_ROLES = new ArrayList<>(
 | 
			
		||||
			Arrays.asList("HERO"));
 | 
			
		||||
 | 
			
		||||
	private HttpServletRequest request = new MockHttpServletRequest();
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -64,8 +62,6 @@ public class HealthMvcEndpointTests {
 | 
			
		|||
 | 
			
		||||
	private HealthMvcEndpoint mvc = null;
 | 
			
		||||
 | 
			
		||||
	private MockEnvironment environment;
 | 
			
		||||
 | 
			
		||||
	private HttpServletRequest defaultUser = createAuthenticationRequest("ROLE_ACTUATOR");
 | 
			
		||||
 | 
			
		||||
	private HttpServletRequest hero = createAuthenticationRequest("HERO");
 | 
			
		||||
| 
						 | 
				
			
			@ -81,8 +77,6 @@ public class HealthMvcEndpointTests {
 | 
			
		|||
		this.endpoint = mock(HealthEndpoint.class);
 | 
			
		||||
		given(this.endpoint.isEnabled()).willReturn(true);
 | 
			
		||||
		this.mvc = new HealthMvcEndpoint(this.endpoint);
 | 
			
		||||
		this.environment = new MockEnvironment();
 | 
			
		||||
		this.mvc.setEnvironment(this.environment);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	@Test
 | 
			
		||||
| 
						 | 
				
			
			@ -123,7 +117,7 @@ public class HealthMvcEndpointTests {
 | 
			
		|||
	public void customMappingWithRelaxedName() {
 | 
			
		||||
		given(this.endpoint.invoke())
 | 
			
		||||
				.willReturn(new Health.Builder().outOfService().build());
 | 
			
		||||
		this.mvc.setStatusMapping(Collections.singletonMap("out-of-service",
 | 
			
		||||
		this.mvc.setStatusMapping(Collections.singletonMap("out-OF-serVice",
 | 
			
		||||
				HttpStatus.INTERNAL_SERVER_ERROR));
 | 
			
		||||
		Object result = this.mvc.invoke(this.request, null);
 | 
			
		||||
		assertThat(result instanceof ResponseEntity).isTrue();
 | 
			
		||||
| 
						 | 
				
			
			@ -165,7 +159,7 @@ public class HealthMvcEndpointTests {
 | 
			
		|||
 | 
			
		||||
	@Test
 | 
			
		||||
	public void rightAuthorityPresentShouldExposeDetails() throws Exception {
 | 
			
		||||
		this.environment.getPropertySources().addLast(SECURITY_ROLES);
 | 
			
		||||
		this.mvc = new HealthMvcEndpoint(this.endpoint, true, SECURITY_ROLES);
 | 
			
		||||
		Authentication principal = mock(Authentication.class);
 | 
			
		||||
		Set<SimpleGrantedAuthority> authorities = Collections
 | 
			
		||||
				.singleton(new SimpleGrantedAuthority("HERO"));
 | 
			
		||||
| 
						 | 
				
			
			@ -180,7 +174,7 @@ public class HealthMvcEndpointTests {
 | 
			
		|||
 | 
			
		||||
	@Test
 | 
			
		||||
	public void customRolePresentShouldExposeDetails() {
 | 
			
		||||
		this.environment.getPropertySources().addLast(SECURITY_ROLES);
 | 
			
		||||
		this.mvc = new HealthMvcEndpoint(this.endpoint, true, SECURITY_ROLES);
 | 
			
		||||
		given(this.endpoint.invoke())
 | 
			
		||||
				.willReturn(new Health.Builder().up().withDetail("foo", "bar").build());
 | 
			
		||||
		Object result = this.mvc.invoke(this.hero, null);
 | 
			
		||||
| 
						 | 
				
			
			@ -191,7 +185,7 @@ public class HealthMvcEndpointTests {
 | 
			
		|||
 | 
			
		||||
	@Test
 | 
			
		||||
	public void customRoleShouldNotExposeDetailsForDefaultRole() {
 | 
			
		||||
		this.environment.getPropertySources().addLast(SECURITY_ROLES);
 | 
			
		||||
		this.mvc = new HealthMvcEndpoint(this.endpoint, true, SECURITY_ROLES);
 | 
			
		||||
		given(this.endpoint.invoke())
 | 
			
		||||
				.willReturn(new Health.Builder().up().withDetail("foo", "bar").build());
 | 
			
		||||
		Object result = this.mvc.invoke(this.defaultUser, null);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,5 +1,5 @@
 | 
			
		|||
/*
 | 
			
		||||
 * Copyright 2012-2016 the original author or authors.
 | 
			
		||||
 * Copyright 2012-2017 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.
 | 
			
		||||
| 
						 | 
				
			
			@ -16,11 +16,16 @@
 | 
			
		|||
 | 
			
		||||
package org.springframework.boot.actuate.info;
 | 
			
		||||
 | 
			
		||||
import java.util.Collections;
 | 
			
		||||
import java.util.Map;
 | 
			
		||||
 | 
			
		||||
import org.junit.Test;
 | 
			
		||||
 | 
			
		||||
import org.springframework.boot.test.util.EnvironmentTestUtils;
 | 
			
		||||
import org.springframework.core.env.ConfigurableEnvironment;
 | 
			
		||||
import org.springframework.core.env.MutablePropertySources;
 | 
			
		||||
import org.springframework.core.env.StandardEnvironment;
 | 
			
		||||
import org.springframework.core.env.SystemEnvironmentPropertySource;
 | 
			
		||||
 | 
			
		||||
import static org.assertj.core.api.Assertions.assertThat;
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -50,6 +55,16 @@ public class EnvironmentInfoContributorTests {
 | 
			
		|||
		assertThat(actual.getDetails().size()).isEqualTo(0);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	@Test
 | 
			
		||||
	@SuppressWarnings("unchecked")
 | 
			
		||||
	public void propertiesFromEnvironmentShouldBindCorrectly() throws Exception {
 | 
			
		||||
		MutablePropertySources propertySources = this.environment.getPropertySources();
 | 
			
		||||
		propertySources.addFirst(new SystemEnvironmentPropertySource("system",
 | 
			
		||||
				Collections.singletonMap("INFO_ENVIRONMENT_FOO", "green")));
 | 
			
		||||
		Info actual = contributeFrom(this.environment);
 | 
			
		||||
		assertThat(actual.get("environment", Map.class)).containsEntry("foo", "green");
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	private static Info contributeFrom(ConfigurableEnvironment environment) {
 | 
			
		||||
		EnvironmentInfoContributor contributor = new EnvironmentInfoContributor(
 | 
			
		||||
				environment);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -20,10 +20,8 @@ import java.io.IOException;
 | 
			
		|||
import java.util.ArrayList;
 | 
			
		||||
import java.util.Arrays;
 | 
			
		||||
import java.util.Collections;
 | 
			
		||||
import java.util.HashSet;
 | 
			
		||||
import java.util.LinkedHashSet;
 | 
			
		||||
import java.util.List;
 | 
			
		||||
import java.util.Map;
 | 
			
		||||
import java.util.Set;
 | 
			
		||||
import java.util.concurrent.TimeUnit;
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -37,7 +35,7 @@ import org.springframework.beans.factory.BeanFactory;
 | 
			
		|||
import org.springframework.beans.factory.BeanFactoryAware;
 | 
			
		||||
import org.springframework.beans.factory.NoSuchBeanDefinitionException;
 | 
			
		||||
import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;
 | 
			
		||||
import org.springframework.boot.bind.RelaxedPropertyResolver;
 | 
			
		||||
import org.springframework.boot.context.properties.bind.Binder;
 | 
			
		||||
import org.springframework.context.EnvironmentAware;
 | 
			
		||||
import org.springframework.context.ResourceLoaderAware;
 | 
			
		||||
import org.springframework.context.annotation.DeferredImportSelector;
 | 
			
		||||
| 
						 | 
				
			
			@ -52,7 +50,6 @@ import org.springframework.core.type.classreading.CachingMetadataReaderFactory;
 | 
			
		|||
import org.springframework.core.type.classreading.MetadataReaderFactory;
 | 
			
		||||
import org.springframework.util.Assert;
 | 
			
		||||
import org.springframework.util.ClassUtils;
 | 
			
		||||
import org.springframework.util.StringUtils;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * {@link DeferredImportSelector} to handle {@link EnableAutoConfiguration
 | 
			
		||||
| 
						 | 
				
			
			@ -211,28 +208,14 @@ public class AutoConfigurationImportSelector
 | 
			
		|||
	}
 | 
			
		||||
 | 
			
		||||
	private List<String> getExcludeAutoConfigurationsProperty() {
 | 
			
		||||
		String name = "spring.autoconfigure.exclude";
 | 
			
		||||
		if (getEnvironment() instanceof ConfigurableEnvironment) {
 | 
			
		||||
			RelaxedPropertyResolver resolver = new RelaxedPropertyResolver(
 | 
			
		||||
					this.environment, "spring.autoconfigure.");
 | 
			
		||||
			Map<String, Object> properties = resolver.getSubProperties("exclude");
 | 
			
		||||
			if (properties.isEmpty()) {
 | 
			
		||||
				return Collections.emptyList();
 | 
			
		||||
			}
 | 
			
		||||
			List<String> excludes = new ArrayList<>();
 | 
			
		||||
			for (Map.Entry<String, Object> entry : properties.entrySet()) {
 | 
			
		||||
				String name = entry.getKey();
 | 
			
		||||
				Object value = entry.getValue();
 | 
			
		||||
				if (name.isEmpty() || name.startsWith("[") && value != null) {
 | 
			
		||||
					excludes.addAll(new HashSet<>(Arrays.asList(StringUtils
 | 
			
		||||
							.tokenizeToStringArray(String.valueOf(value), ","))));
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
			return excludes;
 | 
			
		||||
			Binder binder = Binder.get(getEnvironment());
 | 
			
		||||
			return binder.bind(name, String[].class).map(Arrays::asList)
 | 
			
		||||
					.orElse(Collections.emptyList());
 | 
			
		||||
		}
 | 
			
		||||
		RelaxedPropertyResolver resolver = new RelaxedPropertyResolver(getEnvironment(),
 | 
			
		||||
				"spring.autoconfigure.");
 | 
			
		||||
		String[] exclude = resolver.getProperty("exclude", String[].class);
 | 
			
		||||
		return (Arrays.asList(exclude == null ? new String[0] : exclude));
 | 
			
		||||
		String[] excludes = getEnvironment().getProperty(name, String[].class);
 | 
			
		||||
		return (excludes == null ? Collections.emptyList() : Arrays.asList(excludes));
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	private List<String> sort(List<String> configurations,
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -19,8 +19,11 @@ package org.springframework.boot.autoconfigure.cache;
 | 
			
		|||
import org.springframework.boot.autoconfigure.condition.ConditionMessage;
 | 
			
		||||
import org.springframework.boot.autoconfigure.condition.ConditionOutcome;
 | 
			
		||||
import org.springframework.boot.autoconfigure.condition.SpringBootCondition;
 | 
			
		||||
import org.springframework.boot.bind.RelaxedPropertyResolver;
 | 
			
		||||
import org.springframework.boot.context.properties.bind.BindException;
 | 
			
		||||
import org.springframework.boot.context.properties.bind.BindResult;
 | 
			
		||||
import org.springframework.boot.context.properties.bind.Binder;
 | 
			
		||||
import org.springframework.context.annotation.ConditionContext;
 | 
			
		||||
import org.springframework.core.env.Environment;
 | 
			
		||||
import org.springframework.core.type.AnnotatedTypeMetadata;
 | 
			
		||||
import org.springframework.core.type.AnnotationMetadata;
 | 
			
		||||
import org.springframework.core.type.ClassMetadata;
 | 
			
		||||
| 
						 | 
				
			
			@ -30,6 +33,7 @@ import org.springframework.core.type.ClassMetadata;
 | 
			
		|||
 *
 | 
			
		||||
 * @author Stephane Nicoll
 | 
			
		||||
 * @author Phillip Webb
 | 
			
		||||
 * @author Madhura Bhave
 | 
			
		||||
 * @since 1.3.0
 | 
			
		||||
 */
 | 
			
		||||
class CacheCondition extends SpringBootCondition {
 | 
			
		||||
| 
						 | 
				
			
			@ -43,18 +47,23 @@ class CacheCondition extends SpringBootCondition {
 | 
			
		|||
		}
 | 
			
		||||
		ConditionMessage.Builder message = ConditionMessage.forCondition("Cache",
 | 
			
		||||
				sourceClass);
 | 
			
		||||
		RelaxedPropertyResolver resolver = new RelaxedPropertyResolver(
 | 
			
		||||
				context.getEnvironment(), "spring.cache.");
 | 
			
		||||
		if (!resolver.containsProperty("type")) {
 | 
			
		||||
			return ConditionOutcome.match(message.because("automatic cache type"));
 | 
			
		||||
		Environment environment = context.getEnvironment();
 | 
			
		||||
		try {
 | 
			
		||||
			BindResult<CacheType> specified = Binder.get(environment)
 | 
			
		||||
					.bind("spring.cache.type", CacheType.class);
 | 
			
		||||
			if (!specified.isBound()) {
 | 
			
		||||
				return ConditionOutcome.match(message.because("automatic cache type"));
 | 
			
		||||
			}
 | 
			
		||||
			CacheType required = CacheConfigurations
 | 
			
		||||
					.getType(((AnnotationMetadata) metadata).getClassName());
 | 
			
		||||
			if (specified.get() == required) {
 | 
			
		||||
				return ConditionOutcome
 | 
			
		||||
						.match(message.because(specified.get() + " cache type"));
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
		CacheType cacheType = CacheConfigurations
 | 
			
		||||
				.getType(((AnnotationMetadata) metadata).getClassName());
 | 
			
		||||
		String value = resolver.getProperty("type").replace('-', '_').toUpperCase();
 | 
			
		||||
		if (value.equals(cacheType.name())) {
 | 
			
		||||
			return ConditionOutcome.match(message.because(value + " cache type"));
 | 
			
		||||
		catch (BindException ex) {
 | 
			
		||||
		}
 | 
			
		||||
		return ConditionOutcome.noMatch(message.because(value + " cache type"));
 | 
			
		||||
		return ConditionOutcome.noMatch(message.because("unknown cache type"));
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,5 +1,5 @@
 | 
			
		|||
/*
 | 
			
		||||
 * Copyright 2012-2016 the original author or authors.
 | 
			
		||||
 * Copyright 2012-2017 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.
 | 
			
		||||
| 
						 | 
				
			
			@ -35,6 +35,7 @@ import org.springframework.core.io.Resource;
 | 
			
		|||
 *
 | 
			
		||||
 * @author Eddú Meléndez
 | 
			
		||||
 * @author Stephane Nicoll
 | 
			
		||||
 * @author Madhura Bhave
 | 
			
		||||
 * @since 1.3.0
 | 
			
		||||
 */
 | 
			
		||||
@Configuration
 | 
			
		||||
| 
						 | 
				
			
			@ -78,7 +79,7 @@ class EhCacheCacheConfiguration {
 | 
			
		|||
	static class ConfigAvailableCondition extends ResourceCondition {
 | 
			
		||||
 | 
			
		||||
		ConfigAvailableCondition() {
 | 
			
		||||
			super("EhCache", "spring.cache.ehcache", "config", "classpath:/ehcache.xml");
 | 
			
		||||
			super("EhCache", "spring.cache.ehcache.config", "classpath:/ehcache.xml");
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
	}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -34,7 +34,6 @@ import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
 | 
			
		|||
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
 | 
			
		||||
import org.springframework.boot.autoconfigure.condition.ConditionalOnSingleCandidate;
 | 
			
		||||
import org.springframework.boot.autoconfigure.condition.SpringBootCondition;
 | 
			
		||||
import org.springframework.boot.bind.RelaxedPropertyResolver;
 | 
			
		||||
import org.springframework.cache.jcache.JCacheCacheManager;
 | 
			
		||||
import org.springframework.context.annotation.Bean;
 | 
			
		||||
import org.springframework.context.annotation.ConditionContext;
 | 
			
		||||
| 
						 | 
				
			
			@ -53,6 +52,7 @@ import org.springframework.util.StringUtils;
 | 
			
		|||
 * Cache configuration for JSR-107 compliant providers.
 | 
			
		||||
 *
 | 
			
		||||
 * @author Stephane Nicoll
 | 
			
		||||
 * @author Madhura Bhave
 | 
			
		||||
 * @since 1.3.0
 | 
			
		||||
 */
 | 
			
		||||
@Configuration
 | 
			
		||||
| 
						 | 
				
			
			@ -187,9 +187,8 @@ class JCacheCacheConfiguration {
 | 
			
		|||
		public ConditionOutcome getMatchOutcome(ConditionContext context,
 | 
			
		||||
				AnnotatedTypeMetadata metadata) {
 | 
			
		||||
			ConditionMessage.Builder message = ConditionMessage.forCondition("JCache");
 | 
			
		||||
			RelaxedPropertyResolver resolver = new RelaxedPropertyResolver(
 | 
			
		||||
					context.getEnvironment(), "spring.cache.jcache.");
 | 
			
		||||
			if (resolver.containsProperty("provider")) {
 | 
			
		||||
			String providerProperty = "spring.cache.jcache.provider";
 | 
			
		||||
			if (context.getEnvironment().containsProperty(providerProperty)) {
 | 
			
		||||
				return ConditionOutcome
 | 
			
		||||
						.match(message.because("JCache provider specified"));
 | 
			
		||||
			}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,5 +1,5 @@
 | 
			
		|||
/*
 | 
			
		||||
 * Copyright 2012-2016 the original author or authors.
 | 
			
		||||
 * Copyright 2012-2017 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.
 | 
			
		||||
| 
						 | 
				
			
			@ -122,10 +122,4 @@ public @interface ConditionalOnProperty {
 | 
			
		|||
	 */
 | 
			
		||||
	boolean matchIfMissing() default false;
 | 
			
		||||
 | 
			
		||||
	/**
 | 
			
		||||
	 * If relaxed names should be checked. Defaults to {@code true}.
 | 
			
		||||
	 * @return if relaxed names are used
 | 
			
		||||
	 */
 | 
			
		||||
	boolean relaxedNames() default true;
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -23,7 +23,6 @@ import java.util.Map;
 | 
			
		|||
import java.util.Map.Entry;
 | 
			
		||||
 | 
			
		||||
import org.springframework.boot.autoconfigure.condition.ConditionMessage.Style;
 | 
			
		||||
import org.springframework.boot.bind.RelaxedPropertyResolver;
 | 
			
		||||
import org.springframework.context.annotation.Condition;
 | 
			
		||||
import org.springframework.context.annotation.ConditionContext;
 | 
			
		||||
import org.springframework.core.Ordered;
 | 
			
		||||
| 
						 | 
				
			
			@ -121,8 +120,6 @@ class OnPropertyCondition extends SpringBootCondition {
 | 
			
		|||
 | 
			
		||||
		private final String[] names;
 | 
			
		||||
 | 
			
		||||
		private final boolean relaxedNames;
 | 
			
		||||
 | 
			
		||||
		private final boolean matchIfMissing;
 | 
			
		||||
 | 
			
		||||
		Spec(AnnotationAttributes annotationAttributes) {
 | 
			
		||||
| 
						 | 
				
			
			@ -133,7 +130,6 @@ class OnPropertyCondition extends SpringBootCondition {
 | 
			
		|||
			this.prefix = prefix;
 | 
			
		||||
			this.havingValue = annotationAttributes.getString("havingValue");
 | 
			
		||||
			this.names = getNames(annotationAttributes);
 | 
			
		||||
			this.relaxedNames = annotationAttributes.getBoolean("relaxedNames");
 | 
			
		||||
			this.matchIfMissing = annotationAttributes.getBoolean("matchIfMissing");
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -149,11 +145,8 @@ class OnPropertyCondition extends SpringBootCondition {
 | 
			
		|||
 | 
			
		||||
		private void collectProperties(PropertyResolver resolver, List<String> missing,
 | 
			
		||||
				List<String> nonMatching) {
 | 
			
		||||
			if (this.relaxedNames) {
 | 
			
		||||
				resolver = new RelaxedPropertyResolver(resolver, this.prefix);
 | 
			
		||||
			}
 | 
			
		||||
			for (String name : this.names) {
 | 
			
		||||
				String key = (this.relaxedNames ? name : this.prefix + name);
 | 
			
		||||
				String key = this.prefix + name;
 | 
			
		||||
				if (resolver.containsProperty(key)) {
 | 
			
		||||
					if (!isMatch(resolver.getProperty(key), this.havingValue)) {
 | 
			
		||||
						nonMatching.add(name);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -22,7 +22,6 @@ import java.util.List;
 | 
			
		|||
 | 
			
		||||
import org.springframework.boot.autoconfigure.condition.ConditionMessage.Builder;
 | 
			
		||||
import org.springframework.boot.autoconfigure.condition.ConditionMessage.Style;
 | 
			
		||||
import org.springframework.boot.bind.RelaxedPropertyResolver;
 | 
			
		||||
import org.springframework.context.annotation.ConditionContext;
 | 
			
		||||
import org.springframework.core.io.Resource;
 | 
			
		||||
import org.springframework.core.type.AnnotatedTypeMetadata;
 | 
			
		||||
| 
						 | 
				
			
			@ -33,42 +32,38 @@ import org.springframework.core.type.AnnotatedTypeMetadata;
 | 
			
		|||
 *
 | 
			
		||||
 * @author Stephane Nicoll
 | 
			
		||||
 * @author Phillip Webb
 | 
			
		||||
 * @author Madhura Bhave
 | 
			
		||||
 * @since 1.3.0
 | 
			
		||||
 */
 | 
			
		||||
public abstract class ResourceCondition extends SpringBootCondition {
 | 
			
		||||
 | 
			
		||||
	private final String name;
 | 
			
		||||
 | 
			
		||||
	private final String prefix;
 | 
			
		||||
 | 
			
		||||
	private final String propertyName;
 | 
			
		||||
	private final String property;
 | 
			
		||||
 | 
			
		||||
	private final String[] resourceLocations;
 | 
			
		||||
 | 
			
		||||
	/**
 | 
			
		||||
	 * Create a new condition.
 | 
			
		||||
	 * @param name the name of the component
 | 
			
		||||
	 * @param prefix the prefix of the configuration key
 | 
			
		||||
	 * @param propertyName the name of the configuration key
 | 
			
		||||
	 * @param property the configuration property
 | 
			
		||||
	 * @param resourceLocations default location(s) where the configuration file can be
 | 
			
		||||
	 * found if the configuration key is not specified
 | 
			
		||||
	 * @since 2.0.0
 | 
			
		||||
	 */
 | 
			
		||||
	protected ResourceCondition(String name, String prefix, String propertyName,
 | 
			
		||||
	protected ResourceCondition(String name, String property,
 | 
			
		||||
			String... resourceLocations) {
 | 
			
		||||
		this.name = name;
 | 
			
		||||
		this.prefix = (prefix.endsWith(".") ? prefix : prefix + ".");
 | 
			
		||||
		this.propertyName = propertyName;
 | 
			
		||||
		this.property = property;
 | 
			
		||||
		this.resourceLocations = resourceLocations;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	@Override
 | 
			
		||||
	public ConditionOutcome getMatchOutcome(ConditionContext context,
 | 
			
		||||
			AnnotatedTypeMetadata metadata) {
 | 
			
		||||
		RelaxedPropertyResolver resolver = new RelaxedPropertyResolver(
 | 
			
		||||
				context.getEnvironment(), this.prefix);
 | 
			
		||||
		if (resolver.containsProperty(this.propertyName)) {
 | 
			
		||||
			return ConditionOutcome.match(startConditionMessage()
 | 
			
		||||
					.foundExactly("property " + this.prefix + this.propertyName));
 | 
			
		||||
		if (context.getEnvironment().containsProperty(this.property)) {
 | 
			
		||||
			return ConditionOutcome.match(
 | 
			
		||||
					startConditionMessage().foundExactly("property " + this.property));
 | 
			
		||||
		}
 | 
			
		||||
		return getResourceOutcome(context, metadata);
 | 
			
		||||
	}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -16,76 +16,42 @@
 | 
			
		|||
 | 
			
		||||
package org.springframework.boot.autoconfigure.couchbase;
 | 
			
		||||
 | 
			
		||||
import java.util.AbstractMap;
 | 
			
		||||
import java.util.HashMap;
 | 
			
		||||
import java.util.Map;
 | 
			
		||||
import java.util.List;
 | 
			
		||||
 | 
			
		||||
import org.springframework.boot.autoconfigure.condition.ConditionMessage;
 | 
			
		||||
import org.springframework.boot.autoconfigure.condition.ConditionOutcome;
 | 
			
		||||
import org.springframework.boot.autoconfigure.condition.SpringBootCondition;
 | 
			
		||||
import org.springframework.boot.bind.PropertySourcesPropertyValues;
 | 
			
		||||
import org.springframework.boot.bind.RelaxedDataBinder;
 | 
			
		||||
import org.springframework.boot.bind.RelaxedNames;
 | 
			
		||||
import org.springframework.boot.context.properties.bind.BindResult;
 | 
			
		||||
import org.springframework.boot.context.properties.bind.Bindable;
 | 
			
		||||
import org.springframework.boot.context.properties.bind.Binder;
 | 
			
		||||
import org.springframework.context.annotation.ConditionContext;
 | 
			
		||||
import org.springframework.core.env.ConfigurableEnvironment;
 | 
			
		||||
import org.springframework.core.env.Environment;
 | 
			
		||||
import org.springframework.core.env.PropertySources;
 | 
			
		||||
import org.springframework.core.type.AnnotatedTypeMetadata;
 | 
			
		||||
import org.springframework.validation.DataBinder;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Condition to determine if {@code spring.couchbase.bootstrap-hosts} is specified.
 | 
			
		||||
 *
 | 
			
		||||
 * @author Stephane Nicoll
 | 
			
		||||
 * @author Madhura Bhave
 | 
			
		||||
 */
 | 
			
		||||
class OnBootstrapHostsCondition extends SpringBootCondition {
 | 
			
		||||
 | 
			
		||||
	private static final Bindable<List<String>> STRING_LIST = Bindable
 | 
			
		||||
			.listOf(String.class);
 | 
			
		||||
 | 
			
		||||
	@Override
 | 
			
		||||
	public ConditionOutcome getMatchOutcome(ConditionContext context,
 | 
			
		||||
			AnnotatedTypeMetadata metadata) {
 | 
			
		||||
		Environment environment = context.getEnvironment();
 | 
			
		||||
		PropertyResolver resolver = new PropertyResolver(
 | 
			
		||||
				((ConfigurableEnvironment) environment).getPropertySources(),
 | 
			
		||||
				"spring.couchbase");
 | 
			
		||||
		Map.Entry<String, Object> entry = resolver.resolveProperty("bootstrap-hosts");
 | 
			
		||||
		if (entry != null) {
 | 
			
		||||
		String name = "spring.couchbase.bootstrap-hosts";
 | 
			
		||||
		BindResult<?> property = Binder.get(context.getEnvironment()).bind(name,
 | 
			
		||||
				STRING_LIST);
 | 
			
		||||
		if (property.isBound()) {
 | 
			
		||||
			return ConditionOutcome.match(ConditionMessage
 | 
			
		||||
					.forCondition(OnBootstrapHostsCondition.class.getName())
 | 
			
		||||
					.found("property").items("spring.couchbase.bootstrap-hosts"));
 | 
			
		||||
					.found("property").items(name));
 | 
			
		||||
		}
 | 
			
		||||
		return ConditionOutcome.noMatch(ConditionMessage
 | 
			
		||||
				.forCondition(OnBootstrapHostsCondition.class.getName())
 | 
			
		||||
				.didNotFind("property").items("spring.couchbase.bootstrap-hosts"));
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	private static class PropertyResolver {
 | 
			
		||||
 | 
			
		||||
		private final String prefix;
 | 
			
		||||
 | 
			
		||||
		private final Map<String, Object> content;
 | 
			
		||||
 | 
			
		||||
		PropertyResolver(PropertySources propertySources, String prefix) {
 | 
			
		||||
			this.prefix = prefix;
 | 
			
		||||
			this.content = new HashMap<>();
 | 
			
		||||
			DataBinder binder = new RelaxedDataBinder(this.content, this.prefix);
 | 
			
		||||
			binder.bind(new PropertySourcesPropertyValues(propertySources));
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		Map.Entry<String, Object> resolveProperty(String name) {
 | 
			
		||||
			RelaxedNames prefixes = new RelaxedNames(this.prefix);
 | 
			
		||||
			RelaxedNames keys = new RelaxedNames(name);
 | 
			
		||||
			for (String prefix : prefixes) {
 | 
			
		||||
				for (String relaxedKey : keys) {
 | 
			
		||||
					String key = prefix + relaxedKey;
 | 
			
		||||
					if (this.content.containsKey(relaxedKey)) {
 | 
			
		||||
						return new AbstractMap.SimpleEntry<>(key,
 | 
			
		||||
								this.content.get(relaxedKey));
 | 
			
		||||
					}
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
			return null;
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		return ConditionOutcome.noMatch(
 | 
			
		||||
				ConditionMessage.forCondition(OnBootstrapHostsCondition.class.getName())
 | 
			
		||||
						.didNotFind("property").items(name));
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -20,7 +20,6 @@ import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
 | 
			
		|||
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
 | 
			
		||||
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
 | 
			
		||||
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
 | 
			
		||||
import org.springframework.boot.bind.RelaxedPropertyResolver;
 | 
			
		||||
import org.springframework.context.annotation.Bean;
 | 
			
		||||
import org.springframework.core.env.Environment;
 | 
			
		||||
import org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor;
 | 
			
		||||
| 
						 | 
				
			
			@ -31,6 +30,7 @@ import org.springframework.dao.annotation.PersistenceExceptionTranslationPostPro
 | 
			
		|||
 *
 | 
			
		||||
 * @author Andy Wilkinson
 | 
			
		||||
 * @author Stephane Nicoll
 | 
			
		||||
 * @author Madhura Bhave
 | 
			
		||||
 * @since 1.2.0
 | 
			
		||||
 */
 | 
			
		||||
@ConditionalOnClass(PersistenceExceptionTranslationPostProcessor.class)
 | 
			
		||||
| 
						 | 
				
			
			@ -42,15 +42,10 @@ public class PersistenceExceptionTranslationAutoConfiguration {
 | 
			
		|||
	public static PersistenceExceptionTranslationPostProcessor persistenceExceptionTranslationPostProcessor(
 | 
			
		||||
			Environment environment) {
 | 
			
		||||
		PersistenceExceptionTranslationPostProcessor postProcessor = new PersistenceExceptionTranslationPostProcessor();
 | 
			
		||||
		postProcessor.setProxyTargetClass(determineProxyTargetClass(environment));
 | 
			
		||||
		boolean proxyTargetClass = environment.getProperty(
 | 
			
		||||
				"spring.aop.proxy-target-class", Boolean.class, Boolean.TRUE);
 | 
			
		||||
		postProcessor.setProxyTargetClass(proxyTargetClass);
 | 
			
		||||
		return postProcessor;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	private static boolean determineProxyTargetClass(Environment environment) {
 | 
			
		||||
		RelaxedPropertyResolver resolver = new RelaxedPropertyResolver(environment,
 | 
			
		||||
				"spring.aop.");
 | 
			
		||||
		Boolean value = resolver.getProperty("proxyTargetClass", Boolean.class);
 | 
			
		||||
		return (value != null ? value : true);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -30,12 +30,11 @@ import org.springframework.boot.autoconfigure.cassandra.CassandraProperties;
 | 
			
		|||
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
 | 
			
		||||
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
 | 
			
		||||
import org.springframework.boot.autoconfigure.domain.EntityScanPackages;
 | 
			
		||||
import org.springframework.boot.bind.RelaxedPropertyResolver;
 | 
			
		||||
import org.springframework.boot.context.properties.EnableConfigurationProperties;
 | 
			
		||||
import org.springframework.boot.context.properties.bind.Binder;
 | 
			
		||||
import org.springframework.context.annotation.Bean;
 | 
			
		||||
import org.springframework.context.annotation.Configuration;
 | 
			
		||||
import org.springframework.core.env.Environment;
 | 
			
		||||
import org.springframework.core.env.PropertyResolver;
 | 
			
		||||
import org.springframework.data.cassandra.config.CassandraEntityClassScanner;
 | 
			
		||||
import org.springframework.data.cassandra.config.CassandraSessionFactoryBean;
 | 
			
		||||
import org.springframework.data.cassandra.config.SchemaAction;
 | 
			
		||||
| 
						 | 
				
			
			@ -54,6 +53,7 @@ import org.springframework.util.StringUtils;
 | 
			
		|||
 * @author Julien Dubois
 | 
			
		||||
 * @author Eddú Meléndez
 | 
			
		||||
 * @author Mark Paluch
 | 
			
		||||
 * @author Madhura Bhave
 | 
			
		||||
 * @since 1.3.0
 | 
			
		||||
 */
 | 
			
		||||
@Configuration
 | 
			
		||||
| 
						 | 
				
			
			@ -68,15 +68,14 @@ public class CassandraDataAutoConfiguration {
 | 
			
		|||
 | 
			
		||||
	private final Cluster cluster;
 | 
			
		||||
 | 
			
		||||
	private final PropertyResolver propertyResolver;
 | 
			
		||||
	private final Environment environment;
 | 
			
		||||
 | 
			
		||||
	public CassandraDataAutoConfiguration(BeanFactory beanFactory,
 | 
			
		||||
			CassandraProperties properties, Cluster cluster, Environment environment) {
 | 
			
		||||
		this.beanFactory = beanFactory;
 | 
			
		||||
		this.properties = properties;
 | 
			
		||||
		this.cluster = cluster;
 | 
			
		||||
		this.propertyResolver = new RelaxedPropertyResolver(environment,
 | 
			
		||||
				"spring.data.cassandra.");
 | 
			
		||||
		this.environment = environment;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	@Bean
 | 
			
		||||
| 
						 | 
				
			
			@ -112,10 +111,9 @@ public class CassandraDataAutoConfiguration {
 | 
			
		|||
		session.setCluster(this.cluster);
 | 
			
		||||
		session.setConverter(converter);
 | 
			
		||||
		session.setKeyspaceName(this.properties.getKeyspaceName());
 | 
			
		||||
		String name = this.propertyResolver.getProperty("schemaAction",
 | 
			
		||||
				SchemaAction.NONE.name());
 | 
			
		||||
		SchemaAction schemaAction = SchemaAction.valueOf(name.toUpperCase());
 | 
			
		||||
		session.setSchemaAction(schemaAction);
 | 
			
		||||
		Binder binder = Binder.get(this.environment);
 | 
			
		||||
		binder.bind("spring.data.cassandra.schema-action", SchemaAction.class)
 | 
			
		||||
				.ifBound(session::setSchemaAction);
 | 
			
		||||
		return session;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,5 +1,5 @@
 | 
			
		|||
/*
 | 
			
		||||
 * Copyright 2012-2016 the original author or authors.
 | 
			
		||||
 * Copyright 2012-2017 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.
 | 
			
		||||
| 
						 | 
				
			
			@ -38,6 +38,7 @@ import org.springframework.core.io.Resource;
 | 
			
		|||
 * configuration file is found in the environment.
 | 
			
		||||
 *
 | 
			
		||||
 * @author Stephane Nicoll
 | 
			
		||||
 * @author Madhura Bhave
 | 
			
		||||
 * @since 1.3.0
 | 
			
		||||
 * @see HazelcastConfigResourceCondition
 | 
			
		||||
 */
 | 
			
		||||
| 
						 | 
				
			
			@ -87,7 +88,7 @@ public class HazelcastAutoConfiguration {
 | 
			
		|||
	static class ConfigAvailableCondition extends HazelcastConfigResourceCondition {
 | 
			
		||||
 | 
			
		||||
		ConfigAvailableCondition() {
 | 
			
		||||
			super("spring.hazelcast", "config");
 | 
			
		||||
			super("spring.hazelcast.config");
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
	}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,5 +1,5 @@
 | 
			
		|||
/*
 | 
			
		||||
 * Copyright 2012-2016 the original author or authors.
 | 
			
		||||
 * Copyright 2012-2017 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.
 | 
			
		||||
| 
						 | 
				
			
			@ -28,15 +28,15 @@ import org.springframework.core.type.AnnotatedTypeMetadata;
 | 
			
		|||
 * property referring to the resource to use has been set.
 | 
			
		||||
 *
 | 
			
		||||
 * @author Stephane Nicoll
 | 
			
		||||
 * @author Madhura Bhave
 | 
			
		||||
 * @since 1.3.0
 | 
			
		||||
 */
 | 
			
		||||
public abstract class HazelcastConfigResourceCondition extends ResourceCondition {
 | 
			
		||||
 | 
			
		||||
	static final String CONFIG_SYSTEM_PROPERTY = "hazelcast.config";
 | 
			
		||||
 | 
			
		||||
	protected HazelcastConfigResourceCondition(String prefix, String propertyName) {
 | 
			
		||||
		super("Hazelcast", prefix, propertyName, "file:./hazelcast.xml",
 | 
			
		||||
				"classpath:/hazelcast.xml");
 | 
			
		||||
	protected HazelcastConfigResourceCondition(String property) {
 | 
			
		||||
		super("Hazelcast", property, "file:./hazelcast.xml", "classpath:/hazelcast.xml");
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	@Override
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,5 +1,5 @@
 | 
			
		|||
/*
 | 
			
		||||
 * Copyright 2012-2016 the original author or authors.
 | 
			
		||||
 * Copyright 2012-2017 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.
 | 
			
		||||
| 
						 | 
				
			
			@ -25,7 +25,6 @@ import org.springframework.boot.autoconfigure.condition.ConditionOutcome;
 | 
			
		|||
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
 | 
			
		||||
import org.springframework.boot.autoconfigure.condition.ConditionalOnResource;
 | 
			
		||||
import org.springframework.boot.autoconfigure.condition.SpringBootCondition;
 | 
			
		||||
import org.springframework.boot.bind.RelaxedPropertyResolver;
 | 
			
		||||
import org.springframework.boot.context.properties.EnableConfigurationProperties;
 | 
			
		||||
import org.springframework.boot.info.BuildProperties;
 | 
			
		||||
import org.springframework.boot.info.GitProperties;
 | 
			
		||||
| 
						 | 
				
			
			@ -33,7 +32,7 @@ import org.springframework.context.annotation.Bean;
 | 
			
		|||
import org.springframework.context.annotation.ConditionContext;
 | 
			
		||||
import org.springframework.context.annotation.Conditional;
 | 
			
		||||
import org.springframework.context.annotation.Configuration;
 | 
			
		||||
import org.springframework.core.env.PropertyResolver;
 | 
			
		||||
import org.springframework.core.env.Environment;
 | 
			
		||||
import org.springframework.core.io.DefaultResourceLoader;
 | 
			
		||||
import org.springframework.core.io.Resource;
 | 
			
		||||
import org.springframework.core.io.ResourceLoader;
 | 
			
		||||
| 
						 | 
				
			
			@ -44,6 +43,7 @@ import org.springframework.core.type.AnnotatedTypeMetadata;
 | 
			
		|||
 * {@link EnableAutoConfiguration Auto-configuration} for various project information.
 | 
			
		||||
 *
 | 
			
		||||
 * @author Stephane Nicoll
 | 
			
		||||
 * @author Madhura Bhave
 | 
			
		||||
 * @since 1.4.0
 | 
			
		||||
 */
 | 
			
		||||
@Configuration
 | 
			
		||||
| 
						 | 
				
			
			@ -91,19 +91,12 @@ public class ProjectInfoAutoConfiguration {
 | 
			
		|||
		public ConditionOutcome getMatchOutcome(ConditionContext context,
 | 
			
		||||
				AnnotatedTypeMetadata metadata) {
 | 
			
		||||
			ResourceLoader loader = context.getResourceLoader();
 | 
			
		||||
			if (loader == null) {
 | 
			
		||||
				loader = this.defaultResourceLoader;
 | 
			
		||||
			}
 | 
			
		||||
			PropertyResolver propertyResolver = context.getEnvironment();
 | 
			
		||||
			RelaxedPropertyResolver resolver = new RelaxedPropertyResolver(
 | 
			
		||||
					propertyResolver, "spring.info.git.");
 | 
			
		||||
			String location = resolver.getProperty("location");
 | 
			
		||||
			loader = (loader != null ? loader : this.defaultResourceLoader);
 | 
			
		||||
			Environment environment = context.getEnvironment();
 | 
			
		||||
			String location = environment.getProperty("spring.info.git.location");
 | 
			
		||||
			if (location == null) {
 | 
			
		||||
				resolver = new RelaxedPropertyResolver(propertyResolver, "spring.git.");
 | 
			
		||||
				location = resolver.getProperty("properties");
 | 
			
		||||
				if (location == null) {
 | 
			
		||||
					location = "classpath:git.properties";
 | 
			
		||||
				}
 | 
			
		||||
				location = environment.getProperty("spring.git.properties");
 | 
			
		||||
				location = (location != null ? location : "classpath:git.properties");
 | 
			
		||||
			}
 | 
			
		||||
			ConditionMessage.Builder message = ConditionMessage
 | 
			
		||||
					.forCondition("GitResource");
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -29,7 +29,6 @@ import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
 | 
			
		|||
import org.springframework.boot.autoconfigure.condition.ConditionalOnSingleCandidate;
 | 
			
		||||
import org.springframework.boot.autoconfigure.condition.SearchStrategy;
 | 
			
		||||
import org.springframework.boot.autoconfigure.jmx.JmxAutoConfiguration;
 | 
			
		||||
import org.springframework.boot.bind.RelaxedPropertyResolver;
 | 
			
		||||
import org.springframework.boot.context.properties.EnableConfigurationProperties;
 | 
			
		||||
import org.springframework.context.EnvironmentAware;
 | 
			
		||||
import org.springframework.context.annotation.Bean;
 | 
			
		||||
| 
						 | 
				
			
			@ -54,6 +53,7 @@ import org.springframework.util.StringUtils;
 | 
			
		|||
 * @author Dave Syer
 | 
			
		||||
 * @author Stephane Nicoll
 | 
			
		||||
 * @author Vedran Pavic
 | 
			
		||||
 * @author Madhura Bhave
 | 
			
		||||
 * @since 1.1.0
 | 
			
		||||
 */
 | 
			
		||||
@Configuration
 | 
			
		||||
| 
						 | 
				
			
			@ -83,7 +83,7 @@ public class IntegrationAutoConfiguration {
 | 
			
		|||
 | 
			
		||||
		private BeanFactory beanFactory;
 | 
			
		||||
 | 
			
		||||
		private RelaxedPropertyResolver propertyResolver;
 | 
			
		||||
		private Environment environment;
 | 
			
		||||
 | 
			
		||||
		@Override
 | 
			
		||||
		public void setBeanFactory(BeanFactory beanFactory) throws BeansException {
 | 
			
		||||
| 
						 | 
				
			
			@ -92,21 +92,20 @@ public class IntegrationAutoConfiguration {
 | 
			
		|||
 | 
			
		||||
		@Override
 | 
			
		||||
		public void setEnvironment(Environment environment) {
 | 
			
		||||
			this.propertyResolver = new RelaxedPropertyResolver(environment,
 | 
			
		||||
					"spring.jmx.");
 | 
			
		||||
			this.environment = environment;
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		@Bean
 | 
			
		||||
		public IntegrationMBeanExporter integrationMbeanExporter() {
 | 
			
		||||
			IntegrationMBeanExporter exporter = new IntegrationMBeanExporter();
 | 
			
		||||
			String defaultDomain = this.propertyResolver.getProperty("default-domain");
 | 
			
		||||
			String defaultDomain = this.environment
 | 
			
		||||
					.getProperty("spring.jmx.default-domain");
 | 
			
		||||
			if (StringUtils.hasLength(defaultDomain)) {
 | 
			
		||||
				exporter.setDefaultDomain(defaultDomain);
 | 
			
		||||
			}
 | 
			
		||||
			String server = this.propertyResolver.getProperty("server", "mbeanServer");
 | 
			
		||||
			if (StringUtils.hasLength(server)) {
 | 
			
		||||
				exporter.setServer(this.beanFactory.getBean(server, MBeanServer.class));
 | 
			
		||||
			}
 | 
			
		||||
			String serverBean = this.environment.getProperty("spring.jmx.server",
 | 
			
		||||
					"mbeanServer");
 | 
			
		||||
			exporter.setServer(this.beanFactory.getBean(serverBean, MBeanServer.class));
 | 
			
		||||
			return exporter;
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -22,8 +22,12 @@ import java.util.Map;
 | 
			
		|||
import javax.sql.DataSource;
 | 
			
		||||
 | 
			
		||||
import org.springframework.beans.BeanUtils;
 | 
			
		||||
import org.springframework.beans.MutablePropertyValues;
 | 
			
		||||
import org.springframework.boot.bind.RelaxedDataBinder;
 | 
			
		||||
import org.springframework.boot.context.properties.bind.Bindable;
 | 
			
		||||
import org.springframework.boot.context.properties.bind.Binder;
 | 
			
		||||
import org.springframework.boot.context.properties.source.ConfigurationPropertyName;
 | 
			
		||||
import org.springframework.boot.context.properties.source.ConfigurationPropertyNameAliases;
 | 
			
		||||
import org.springframework.boot.context.properties.source.ConfigurationPropertySource;
 | 
			
		||||
import org.springframework.boot.context.properties.source.MapConfigurationPropertySource;
 | 
			
		||||
import org.springframework.boot.jdbc.DatabaseDriver;
 | 
			
		||||
import org.springframework.util.ClassUtils;
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -37,6 +41,7 @@ import org.springframework.util.ClassUtils;
 | 
			
		|||
 * {@code @ConfigurationProperties}.
 | 
			
		||||
 *
 | 
			
		||||
 * @author Dave Syer
 | 
			
		||||
 * @author Madhura Bhave
 | 
			
		||||
 * @since 1.1.0
 | 
			
		||||
 */
 | 
			
		||||
public class DataSourceBuilder {
 | 
			
		||||
| 
						 | 
				
			
			@ -82,9 +87,13 @@ public class DataSourceBuilder {
 | 
			
		|||
	}
 | 
			
		||||
 | 
			
		||||
	private void bind(DataSource result) {
 | 
			
		||||
		MutablePropertyValues properties = new MutablePropertyValues(this.properties);
 | 
			
		||||
		new RelaxedDataBinder(result).withAlias("url", "jdbcUrl")
 | 
			
		||||
				.withAlias("username", "user").bind(properties);
 | 
			
		||||
		ConfigurationPropertySource source = new MapConfigurationPropertySource(
 | 
			
		||||
				this.properties);
 | 
			
		||||
		ConfigurationPropertyNameAliases aliases = new ConfigurationPropertyNameAliases();
 | 
			
		||||
		aliases.addAlaises("url", "jdbc-url");
 | 
			
		||||
		aliases.addAlaises("username", "user");
 | 
			
		||||
		Binder binder = new Binder(source.withAliases(aliases));
 | 
			
		||||
		binder.bind(ConfigurationPropertyName.EMPTY, Bindable.ofInstance(result));
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	public DataSourceBuilder type(Class<? extends DataSource> type) {
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,5 +1,5 @@
 | 
			
		|||
/*
 | 
			
		||||
 * Copyright 2012-2016 the original author or authors.
 | 
			
		||||
 * Copyright 2012-2017 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.
 | 
			
		||||
| 
						 | 
				
			
			@ -21,7 +21,6 @@ import javax.sql.XADataSource;
 | 
			
		|||
import javax.transaction.TransactionManager;
 | 
			
		||||
 | 
			
		||||
import org.springframework.beans.BeanUtils;
 | 
			
		||||
import org.springframework.beans.MutablePropertyValues;
 | 
			
		||||
import org.springframework.beans.factory.BeanClassLoaderAware;
 | 
			
		||||
import org.springframework.beans.factory.annotation.Autowired;
 | 
			
		||||
import org.springframework.boot.autoconfigure.AutoConfigureBefore;
 | 
			
		||||
| 
						 | 
				
			
			@ -29,8 +28,13 @@ import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
 | 
			
		|||
import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
 | 
			
		||||
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
 | 
			
		||||
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
 | 
			
		||||
import org.springframework.boot.bind.RelaxedDataBinder;
 | 
			
		||||
import org.springframework.boot.context.properties.EnableConfigurationProperties;
 | 
			
		||||
import org.springframework.boot.context.properties.bind.Bindable;
 | 
			
		||||
import org.springframework.boot.context.properties.bind.Binder;
 | 
			
		||||
import org.springframework.boot.context.properties.source.ConfigurationPropertyName;
 | 
			
		||||
import org.springframework.boot.context.properties.source.ConfigurationPropertyNameAliases;
 | 
			
		||||
import org.springframework.boot.context.properties.source.ConfigurationPropertySource;
 | 
			
		||||
import org.springframework.boot.context.properties.source.MapConfigurationPropertySource;
 | 
			
		||||
import org.springframework.boot.jdbc.DatabaseDriver;
 | 
			
		||||
import org.springframework.boot.jta.XADataSourceWrapper;
 | 
			
		||||
import org.springframework.context.annotation.Bean;
 | 
			
		||||
| 
						 | 
				
			
			@ -44,6 +48,7 @@ import org.springframework.util.StringUtils;
 | 
			
		|||
 *
 | 
			
		||||
 * @author Phillip Webb
 | 
			
		||||
 * @author Josh Long
 | 
			
		||||
 * @author Madhura Bhave
 | 
			
		||||
 * @since 1.2.0
 | 
			
		||||
 */
 | 
			
		||||
@AutoConfigureBefore(DataSourceAutoConfiguration.class)
 | 
			
		||||
| 
						 | 
				
			
			@ -105,13 +110,22 @@ public class XADataSourceAutoConfiguration implements BeanClassLoaderAware {
 | 
			
		|||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	private void bindXaProperties(XADataSource target, DataSourceProperties properties) {
 | 
			
		||||
		MutablePropertyValues values = new MutablePropertyValues();
 | 
			
		||||
		values.add("user", this.properties.determineUsername());
 | 
			
		||||
		values.add("password", this.properties.determinePassword());
 | 
			
		||||
		values.add("url", this.properties.determineUrl());
 | 
			
		||||
		values.addPropertyValues(properties.getXa().getProperties());
 | 
			
		||||
		new RelaxedDataBinder(target).withAlias("user", "username").bind(values);
 | 
			
		||||
	private void bindXaProperties(XADataSource target,
 | 
			
		||||
			DataSourceProperties dataSourceProperties) {
 | 
			
		||||
		Binder binder = new Binder(getBinderSource(dataSourceProperties));
 | 
			
		||||
		binder.bind(ConfigurationPropertyName.EMPTY, Bindable.ofInstance(target));
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	private ConfigurationPropertySource getBinderSource(
 | 
			
		||||
			DataSourceProperties dataSourceProperties) {
 | 
			
		||||
		MapConfigurationPropertySource source = new MapConfigurationPropertySource();
 | 
			
		||||
		source.put("user", this.properties.determineUsername());
 | 
			
		||||
		source.put("password", this.properties.determinePassword());
 | 
			
		||||
		source.put("url", this.properties.determineUrl());
 | 
			
		||||
		source.putAll(dataSourceProperties.getXa().getProperties());
 | 
			
		||||
		ConfigurationPropertyNameAliases aliases = new ConfigurationPropertyNameAliases();
 | 
			
		||||
		aliases.addAlaises("user", "username");
 | 
			
		||||
		return source.withAliases(aliases);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,5 +1,5 @@
 | 
			
		|||
/*
 | 
			
		||||
 * Copyright 2012-2015 the original author or authors.
 | 
			
		||||
 * Copyright 2012-2017 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.
 | 
			
		||||
| 
						 | 
				
			
			@ -26,7 +26,6 @@ import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
 | 
			
		|||
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
 | 
			
		||||
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
 | 
			
		||||
import org.springframework.boot.autoconfigure.condition.SearchStrategy;
 | 
			
		||||
import org.springframework.boot.bind.RelaxedPropertyResolver;
 | 
			
		||||
import org.springframework.context.EnvironmentAware;
 | 
			
		||||
import org.springframework.context.annotation.Bean;
 | 
			
		||||
import org.springframework.context.annotation.Configuration;
 | 
			
		||||
| 
						 | 
				
			
			@ -49,19 +48,20 @@ import org.springframework.util.StringUtils;
 | 
			
		|||
 * To disable auto export of annotation beans set {@code spring.jmx.enabled: false}.
 | 
			
		||||
 *
 | 
			
		||||
 * @author Christian Dupuis
 | 
			
		||||
 * @author Madhura Bhave
 | 
			
		||||
 */
 | 
			
		||||
@Configuration
 | 
			
		||||
@ConditionalOnClass({ MBeanExporter.class })
 | 
			
		||||
@ConditionalOnProperty(prefix = "spring.jmx", name = "enabled", havingValue = "true", matchIfMissing = true)
 | 
			
		||||
public class JmxAutoConfiguration implements EnvironmentAware, BeanFactoryAware {
 | 
			
		||||
 | 
			
		||||
	private RelaxedPropertyResolver propertyResolver;
 | 
			
		||||
	private Environment environment;
 | 
			
		||||
 | 
			
		||||
	private BeanFactory beanFactory;
 | 
			
		||||
 | 
			
		||||
	@Override
 | 
			
		||||
	public void setEnvironment(Environment environment) {
 | 
			
		||||
		this.propertyResolver = new RelaxedPropertyResolver(environment, "spring.jmx.");
 | 
			
		||||
		this.environment = environment;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	@Override
 | 
			
		||||
| 
						 | 
				
			
			@ -76,9 +76,10 @@ public class JmxAutoConfiguration implements EnvironmentAware, BeanFactoryAware
 | 
			
		|||
		AnnotationMBeanExporter exporter = new AnnotationMBeanExporter();
 | 
			
		||||
		exporter.setRegistrationPolicy(RegistrationPolicy.FAIL_ON_EXISTING);
 | 
			
		||||
		exporter.setNamingStrategy(namingStrategy);
 | 
			
		||||
		String server = this.propertyResolver.getProperty("server", "mbeanServer");
 | 
			
		||||
		if (StringUtils.hasLength(server)) {
 | 
			
		||||
			exporter.setServer(this.beanFactory.getBean(server, MBeanServer.class));
 | 
			
		||||
		String serverBean = this.environment.getProperty("spring.jmx.server",
 | 
			
		||||
				"mbeanServer");
 | 
			
		||||
		if (StringUtils.hasLength(serverBean)) {
 | 
			
		||||
			exporter.setServer(this.beanFactory.getBean(serverBean, MBeanServer.class));
 | 
			
		||||
		}
 | 
			
		||||
		return exporter;
 | 
			
		||||
	}
 | 
			
		||||
| 
						 | 
				
			
			@ -88,7 +89,7 @@ public class JmxAutoConfiguration implements EnvironmentAware, BeanFactoryAware
 | 
			
		|||
	public ParentAwareNamingStrategy objectNamingStrategy() {
 | 
			
		||||
		ParentAwareNamingStrategy namingStrategy = new ParentAwareNamingStrategy(
 | 
			
		||||
				new AnnotationJmxAttributeSource());
 | 
			
		||||
		String defaultDomain = this.propertyResolver.getProperty("default-domain");
 | 
			
		||||
		String defaultDomain = this.environment.getProperty("spring.jmx.default-domain");
 | 
			
		||||
		if (StringUtils.hasLength(defaultDomain)) {
 | 
			
		||||
			namingStrategy.setDefaultDomain(defaultDomain);
 | 
			
		||||
		}
 | 
			
		||||
| 
						 | 
				
			
			@ -106,7 +107,6 @@ public class JmxAutoConfiguration implements EnvironmentAware, BeanFactoryAware
 | 
			
		|||
		factory.setLocateExistingServerIfPossible(true);
 | 
			
		||||
		factory.afterPropertiesSet();
 | 
			
		||||
		return factory.getObject();
 | 
			
		||||
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -16,16 +16,10 @@
 | 
			
		|||
 | 
			
		||||
package org.springframework.boot.autoconfigure.mustache;
 | 
			
		||||
 | 
			
		||||
import java.util.HashMap;
 | 
			
		||||
import java.util.Map;
 | 
			
		||||
 | 
			
		||||
import com.samskivert.mustache.DefaultCollector;
 | 
			
		||||
import com.samskivert.mustache.Mustache.Collector;
 | 
			
		||||
import com.samskivert.mustache.Mustache.VariableFetcher;
 | 
			
		||||
 | 
			
		||||
import org.springframework.boot.bind.PropertySourcesPropertyValues;
 | 
			
		||||
import org.springframework.boot.bind.RelaxedDataBinder;
 | 
			
		||||
import org.springframework.boot.bind.RelaxedPropertyResolver;
 | 
			
		||||
import org.springframework.context.EnvironmentAware;
 | 
			
		||||
import org.springframework.core.env.ConfigurableEnvironment;
 | 
			
		||||
import org.springframework.core.env.Environment;
 | 
			
		||||
| 
						 | 
				
			
			@ -34,6 +28,7 @@ import org.springframework.core.env.Environment;
 | 
			
		|||
 * Mustache {@link Collector} to expose properties from the Spring {@link Environment}.
 | 
			
		||||
 *
 | 
			
		||||
 * @author Dave Syer
 | 
			
		||||
 * @author Madhura Bhave
 | 
			
		||||
 * @since 1.2.2
 | 
			
		||||
 */
 | 
			
		||||
public class MustacheEnvironmentCollector extends DefaultCollector
 | 
			
		||||
| 
						 | 
				
			
			@ -41,19 +36,11 @@ public class MustacheEnvironmentCollector extends DefaultCollector
 | 
			
		|||
 | 
			
		||||
	private ConfigurableEnvironment environment;
 | 
			
		||||
 | 
			
		||||
	private Map<String, Object> target;
 | 
			
		||||
 | 
			
		||||
	private RelaxedPropertyResolver propertyResolver;
 | 
			
		||||
 | 
			
		||||
	private final VariableFetcher propertyFetcher = new PropertyVariableFetcher();
 | 
			
		||||
 | 
			
		||||
	@Override
 | 
			
		||||
	public void setEnvironment(Environment environment) {
 | 
			
		||||
		this.environment = (ConfigurableEnvironment) environment;
 | 
			
		||||
		this.target = new HashMap<>();
 | 
			
		||||
		new RelaxedDataBinder(this.target).bind(
 | 
			
		||||
				new PropertySourcesPropertyValues(this.environment.getPropertySources()));
 | 
			
		||||
		this.propertyResolver = new RelaxedPropertyResolver(environment);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	@Override
 | 
			
		||||
| 
						 | 
				
			
			@ -62,7 +49,7 @@ public class MustacheEnvironmentCollector extends DefaultCollector
 | 
			
		|||
		if (fetcher != null) {
 | 
			
		||||
			return fetcher;
 | 
			
		||||
		}
 | 
			
		||||
		if (this.propertyResolver.containsProperty(name)) {
 | 
			
		||||
		if (this.environment.containsProperty(name)) {
 | 
			
		||||
			return this.propertyFetcher;
 | 
			
		||||
		}
 | 
			
		||||
		return null;
 | 
			
		||||
| 
						 | 
				
			
			@ -72,7 +59,7 @@ public class MustacheEnvironmentCollector extends DefaultCollector
 | 
			
		|||
 | 
			
		||||
		@Override
 | 
			
		||||
		public Object get(Object ctx, String name) throws Exception {
 | 
			
		||||
			return MustacheEnvironmentCollector.this.propertyResolver.getProperty(name);
 | 
			
		||||
			return MustacheEnvironmentCollector.this.environment.getProperty(name);
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
	}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,5 +1,5 @@
 | 
			
		|||
/*
 | 
			
		||||
 * Copyright 2012-2015 the original author or authors.
 | 
			
		||||
 * Copyright 2012-2017 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.
 | 
			
		||||
| 
						 | 
				
			
			@ -17,9 +17,7 @@
 | 
			
		|||
package org.springframework.boot.autoconfigure.mustache;
 | 
			
		||||
 | 
			
		||||
import org.springframework.boot.autoconfigure.template.TemplateAvailabilityProvider;
 | 
			
		||||
import org.springframework.boot.bind.RelaxedPropertyResolver;
 | 
			
		||||
import org.springframework.core.env.Environment;
 | 
			
		||||
import org.springframework.core.env.PropertyResolver;
 | 
			
		||||
import org.springframework.core.io.ResourceLoader;
 | 
			
		||||
import org.springframework.util.ClassUtils;
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -28,6 +26,7 @@ import org.springframework.util.ClassUtils;
 | 
			
		|||
 * Mustache view templates.
 | 
			
		||||
 *
 | 
			
		||||
 * @author Dave Syer
 | 
			
		||||
 * @author Madhura Bhave
 | 
			
		||||
 * @since 1.2.2
 | 
			
		||||
 */
 | 
			
		||||
public class MustacheTemplateAvailabilityProvider
 | 
			
		||||
| 
						 | 
				
			
			@ -37,11 +36,9 @@ public class MustacheTemplateAvailabilityProvider
 | 
			
		|||
	public boolean isTemplateAvailable(String view, Environment environment,
 | 
			
		||||
			ClassLoader classLoader, ResourceLoader resourceLoader) {
 | 
			
		||||
		if (ClassUtils.isPresent("com.samskivert.mustache.Template", classLoader)) {
 | 
			
		||||
			PropertyResolver resolver = new RelaxedPropertyResolver(environment,
 | 
			
		||||
					"spring.mustache.");
 | 
			
		||||
			String prefix = resolver.getProperty("prefix",
 | 
			
		||||
			String prefix = environment.getProperty("spring.mustache.prefix",
 | 
			
		||||
					MustacheProperties.DEFAULT_PREFIX);
 | 
			
		||||
			String suffix = resolver.getProperty("suffix",
 | 
			
		||||
			String suffix = environment.getProperty("spring.mustache.suffix",
 | 
			
		||||
					MustacheProperties.DEFAULT_SUFFIX);
 | 
			
		||||
			return resourceLoader.getResource(prefix + view + suffix).exists();
 | 
			
		||||
		}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -34,6 +34,7 @@ import org.springframework.util.StringUtils;
 | 
			
		|||
 * @author Andy Wilkinson
 | 
			
		||||
 * @author Stephane Nicoll
 | 
			
		||||
 * @author Eddú Meléndez
 | 
			
		||||
 * @author Madhura Bhave
 | 
			
		||||
 * @since 1.1.0
 | 
			
		||||
 */
 | 
			
		||||
@ConfigurationProperties(prefix = "spring.jpa")
 | 
			
		||||
| 
						 | 
				
			
			@ -169,11 +170,11 @@ public class JpaProperties {
 | 
			
		|||
			this.ddlAuto = ddlAuto;
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		public boolean isUseNewIdGeneratorMappings() {
 | 
			
		||||
		public Boolean isUseNewIdGeneratorMappings() {
 | 
			
		||||
			return this.useNewIdGeneratorMappings;
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		public void setUseNewIdGeneratorMappings(boolean useNewIdGeneratorMappings) {
 | 
			
		||||
		public void setUseNewIdGeneratorMappings(Boolean useNewIdGeneratorMappings) {
 | 
			
		||||
			this.useNewIdGeneratorMappings = useNewIdGeneratorMappings;
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -31,7 +31,6 @@ import org.springframework.boot.autoconfigure.condition.NoneNestedConditions;
 | 
			
		|||
import org.springframework.boot.autoconfigure.condition.SpringBootCondition;
 | 
			
		||||
import org.springframework.boot.autoconfigure.security.SecurityProperties;
 | 
			
		||||
import org.springframework.boot.autoconfigure.security.oauth2.client.OAuth2RestOperationsConfiguration.OAuth2ClientIdCondition;
 | 
			
		||||
import org.springframework.boot.bind.RelaxedPropertyResolver;
 | 
			
		||||
import org.springframework.boot.context.properties.ConfigurationProperties;
 | 
			
		||||
import org.springframework.boot.web.servlet.FilterRegistrationBean;
 | 
			
		||||
import org.springframework.context.annotation.Bean;
 | 
			
		||||
| 
						 | 
				
			
			@ -42,7 +41,6 @@ import org.springframework.context.annotation.Import;
 | 
			
		|||
import org.springframework.context.annotation.Primary;
 | 
			
		||||
import org.springframework.context.annotation.Scope;
 | 
			
		||||
import org.springframework.context.annotation.ScopedProxyMode;
 | 
			
		||||
import org.springframework.core.env.PropertyResolver;
 | 
			
		||||
import org.springframework.core.type.AnnotatedTypeMetadata;
 | 
			
		||||
import org.springframework.security.core.Authentication;
 | 
			
		||||
import org.springframework.security.core.context.SecurityContextHolder;
 | 
			
		||||
| 
						 | 
				
			
			@ -62,6 +60,7 @@ import org.springframework.util.StringUtils;
 | 
			
		|||
 * Configuration for OAuth2 Single Sign On REST operations.
 | 
			
		||||
 *
 | 
			
		||||
 * @author Dave Syer
 | 
			
		||||
 * @author Madhura Bhave
 | 
			
		||||
 * @since 1.3.0
 | 
			
		||||
 */
 | 
			
		||||
@Configuration
 | 
			
		||||
| 
						 | 
				
			
			@ -159,9 +158,8 @@ public class OAuth2RestOperationsConfiguration {
 | 
			
		|||
		@Override
 | 
			
		||||
		public ConditionOutcome getMatchOutcome(ConditionContext context,
 | 
			
		||||
				AnnotatedTypeMetadata metadata) {
 | 
			
		||||
			PropertyResolver resolver = new RelaxedPropertyResolver(
 | 
			
		||||
					context.getEnvironment(), "security.oauth2.client.");
 | 
			
		||||
			String clientId = resolver.getProperty("client-id");
 | 
			
		||||
			String clientId = context.getEnvironment()
 | 
			
		||||
					.getProperty("security.oauth2.client.client-id");
 | 
			
		||||
			ConditionMessage.Builder message = ConditionMessage
 | 
			
		||||
					.forCondition("OAuth Client ID");
 | 
			
		||||
			if (StringUtils.hasLength(clientId)) {
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -16,6 +16,8 @@
 | 
			
		|||
 | 
			
		||||
package org.springframework.boot.autoconfigure.security.oauth2.resource;
 | 
			
		||||
 | 
			
		||||
import java.util.Map;
 | 
			
		||||
 | 
			
		||||
import org.springframework.beans.BeanUtils;
 | 
			
		||||
import org.springframework.beans.BeansException;
 | 
			
		||||
import org.springframework.beans.factory.config.BeanPostProcessor;
 | 
			
		||||
| 
						 | 
				
			
			@ -28,7 +30,8 @@ import org.springframework.boot.autoconfigure.condition.ConditionalOnWebApplicat
 | 
			
		|||
import org.springframework.boot.autoconfigure.condition.SpringBootCondition;
 | 
			
		||||
import org.springframework.boot.autoconfigure.security.SecurityProperties;
 | 
			
		||||
import org.springframework.boot.autoconfigure.security.oauth2.resource.OAuth2ResourceServerConfiguration.ResourceServerCondition;
 | 
			
		||||
import org.springframework.boot.bind.RelaxedPropertyResolver;
 | 
			
		||||
import org.springframework.boot.context.properties.bind.Bindable;
 | 
			
		||||
import org.springframework.boot.context.properties.bind.Binder;
 | 
			
		||||
import org.springframework.context.ApplicationContext;
 | 
			
		||||
import org.springframework.context.ApplicationContextAware;
 | 
			
		||||
import org.springframework.context.annotation.Bean;
 | 
			
		||||
| 
						 | 
				
			
			@ -39,6 +42,7 @@ import org.springframework.context.annotation.Configuration;
 | 
			
		|||
import org.springframework.context.annotation.ConfigurationCondition;
 | 
			
		||||
import org.springframework.context.annotation.Import;
 | 
			
		||||
import org.springframework.core.annotation.AnnotationUtils;
 | 
			
		||||
import org.springframework.core.env.ConfigurableEnvironment;
 | 
			
		||||
import org.springframework.core.env.Environment;
 | 
			
		||||
import org.springframework.core.type.AnnotatedTypeMetadata;
 | 
			
		||||
import org.springframework.core.type.StandardAnnotationMetadata;
 | 
			
		||||
| 
						 | 
				
			
			@ -58,6 +62,7 @@ import org.springframework.util.StringUtils;
 | 
			
		|||
 *
 | 
			
		||||
 * @author Greg Turnquist
 | 
			
		||||
 * @author Dave Syer
 | 
			
		||||
 * @author Madhura Bhave
 | 
			
		||||
 * @since 1.3.0
 | 
			
		||||
 */
 | 
			
		||||
@Configuration
 | 
			
		||||
| 
						 | 
				
			
			@ -150,6 +155,9 @@ public class OAuth2ResourceServerConfiguration {
 | 
			
		|||
	protected static class ResourceServerCondition extends SpringBootCondition
 | 
			
		||||
			implements ConfigurationCondition {
 | 
			
		||||
 | 
			
		||||
		private static final Bindable<Map<String, Object>> STRING_OBJECT_MAP = Bindable
 | 
			
		||||
				.mapOf(String.class, Object.class);
 | 
			
		||||
 | 
			
		||||
		private static final String AUTHORIZATION_ANNOTATION = "org.springframework."
 | 
			
		||||
				+ "security.oauth2.config.annotation.web.configuration."
 | 
			
		||||
				+ "AuthorizationServerEndpointsConfiguration";
 | 
			
		||||
| 
						 | 
				
			
			@ -165,24 +173,28 @@ public class OAuth2ResourceServerConfiguration {
 | 
			
		|||
			ConditionMessage.Builder message = ConditionMessage
 | 
			
		||||
					.forCondition("OAuth ResourceServer Condition");
 | 
			
		||||
			Environment environment = context.getEnvironment();
 | 
			
		||||
			RelaxedPropertyResolver resolver = new RelaxedPropertyResolver(environment,
 | 
			
		||||
					"security.oauth2.resource.");
 | 
			
		||||
			if (!(environment instanceof ConfigurableEnvironment)) {
 | 
			
		||||
				return ConditionOutcome
 | 
			
		||||
						.noMatch(message.didNotFind("A ConfigurableEnvironment").atAll());
 | 
			
		||||
			}
 | 
			
		||||
			if (hasOAuthClientId(environment)) {
 | 
			
		||||
				return ConditionOutcome.match(message.foundExactly("client-id property"));
 | 
			
		||||
			}
 | 
			
		||||
			if (!resolver.getSubProperties("jwt").isEmpty()) {
 | 
			
		||||
			Binder binder = Binder.get(environment);
 | 
			
		||||
			String prefix = "security.oauth2.resource.";
 | 
			
		||||
			if (binder.bind(prefix + "jwt", STRING_OBJECT_MAP).isBound()) {
 | 
			
		||||
				return ConditionOutcome
 | 
			
		||||
						.match(message.foundExactly("JWT resource configuration"));
 | 
			
		||||
			}
 | 
			
		||||
			if (!resolver.getSubProperties("jwk").isEmpty()) {
 | 
			
		||||
			if (binder.bind(prefix + "jwk", STRING_OBJECT_MAP).isBound()) {
 | 
			
		||||
				return ConditionOutcome
 | 
			
		||||
						.match(message.foundExactly("JWK resource configuration"));
 | 
			
		||||
			}
 | 
			
		||||
			if (StringUtils.hasText(resolver.getProperty("user-info-uri"))) {
 | 
			
		||||
			if (StringUtils.hasText(environment.getProperty(prefix + "user-info-uri"))) {
 | 
			
		||||
				return ConditionOutcome
 | 
			
		||||
						.match(message.foundExactly("user-info-uri property"));
 | 
			
		||||
			}
 | 
			
		||||
			if (StringUtils.hasText(resolver.getProperty("token-info-uri"))) {
 | 
			
		||||
			if (StringUtils.hasText(environment.getProperty(prefix + "token-info-uri"))) {
 | 
			
		||||
				return ConditionOutcome
 | 
			
		||||
						.match(message.foundExactly("token-info-uri property"));
 | 
			
		||||
			}
 | 
			
		||||
| 
						 | 
				
			
			@ -194,14 +206,13 @@ public class OAuth2ResourceServerConfiguration {
 | 
			
		|||
				}
 | 
			
		||||
			}
 | 
			
		||||
			return ConditionOutcome.noMatch(
 | 
			
		||||
					message.didNotFind("client id, JWT resource or authorization server")
 | 
			
		||||
					message.didNotFind("client ID, JWT resource or authorization server")
 | 
			
		||||
							.atAll());
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		private boolean hasOAuthClientId(Environment environment) {
 | 
			
		||||
			RelaxedPropertyResolver resolver = new RelaxedPropertyResolver(environment,
 | 
			
		||||
					"security.oauth2.client.");
 | 
			
		||||
			return StringUtils.hasLength(resolver.getProperty("client-id", ""));
 | 
			
		||||
			return StringUtils.hasLength(
 | 
			
		||||
					environment.getProperty("security.oauth2.client.client-id"));
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
	}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -30,7 +30,6 @@ import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean
 | 
			
		|||
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingClass;
 | 
			
		||||
import org.springframework.boot.autoconfigure.condition.NoneNestedConditions;
 | 
			
		||||
import org.springframework.boot.autoconfigure.condition.SpringBootCondition;
 | 
			
		||||
import org.springframework.boot.bind.RelaxedPropertyResolver;
 | 
			
		||||
import org.springframework.context.annotation.Bean;
 | 
			
		||||
import org.springframework.context.annotation.ConditionContext;
 | 
			
		||||
import org.springframework.context.annotation.Conditional;
 | 
			
		||||
| 
						 | 
				
			
			@ -319,17 +318,17 @@ public class ResourceServerTokenServicesConfiguration {
 | 
			
		|||
			ConditionMessage.Builder message = ConditionMessage
 | 
			
		||||
					.forCondition("OAuth TokenInfo Condition");
 | 
			
		||||
			Environment environment = context.getEnvironment();
 | 
			
		||||
			RelaxedPropertyResolver resolver = new RelaxedPropertyResolver(environment,
 | 
			
		||||
					"security.oauth2.resource.");
 | 
			
		||||
			Boolean preferTokenInfo = resolver.getProperty("prefer-token-info",
 | 
			
		||||
					Boolean.class);
 | 
			
		||||
			Boolean preferTokenInfo = environment.getProperty(
 | 
			
		||||
					"security.oauth2.resource.prefer-token-info", Boolean.class);
 | 
			
		||||
			if (preferTokenInfo == null) {
 | 
			
		||||
				preferTokenInfo = environment
 | 
			
		||||
						.resolvePlaceholders("${OAUTH2_RESOURCE_PREFERTOKENINFO:true}")
 | 
			
		||||
						.equals("true");
 | 
			
		||||
			}
 | 
			
		||||
			String tokenInfoUri = resolver.getProperty("token-info-uri");
 | 
			
		||||
			String userInfoUri = resolver.getProperty("user-info-uri");
 | 
			
		||||
			String tokenInfoUri = environment
 | 
			
		||||
					.getProperty("security.oauth2.resource.token-info-uri");
 | 
			
		||||
			String userInfoUri = environment
 | 
			
		||||
					.getProperty("security.oauth2.resource.user-info-uri");
 | 
			
		||||
			if (!StringUtils.hasLength(userInfoUri)
 | 
			
		||||
					&& !StringUtils.hasLength(tokenInfoUri)) {
 | 
			
		||||
				return ConditionOutcome
 | 
			
		||||
| 
						 | 
				
			
			@ -351,10 +350,11 @@ public class ResourceServerTokenServicesConfiguration {
 | 
			
		|||
				AnnotatedTypeMetadata metadata) {
 | 
			
		||||
			ConditionMessage.Builder message = ConditionMessage
 | 
			
		||||
					.forCondition("OAuth JWT Condition");
 | 
			
		||||
			RelaxedPropertyResolver resolver = new RelaxedPropertyResolver(
 | 
			
		||||
					context.getEnvironment(), "security.oauth2.resource.jwt.");
 | 
			
		||||
			String keyValue = resolver.getProperty("key-value");
 | 
			
		||||
			String keyUri = resolver.getProperty("key-uri");
 | 
			
		||||
			Environment environment = context.getEnvironment();
 | 
			
		||||
			String keyValue = environment
 | 
			
		||||
					.getProperty("security.oauth2.resource.jwt.key-value");
 | 
			
		||||
			String keyUri = environment
 | 
			
		||||
					.getProperty("security.oauth2.resource.jwt.key-uri");
 | 
			
		||||
			if (StringUtils.hasText(keyValue) || StringUtils.hasText(keyUri)) {
 | 
			
		||||
				return ConditionOutcome
 | 
			
		||||
						.match(message.foundExactly("provided public key"));
 | 
			
		||||
| 
						 | 
				
			
			@ -372,9 +372,9 @@ public class ResourceServerTokenServicesConfiguration {
 | 
			
		|||
				AnnotatedTypeMetadata metadata) {
 | 
			
		||||
			ConditionMessage.Builder message = ConditionMessage
 | 
			
		||||
					.forCondition("OAuth JWK Condition");
 | 
			
		||||
			RelaxedPropertyResolver resolver = new RelaxedPropertyResolver(
 | 
			
		||||
					context.getEnvironment(), "security.oauth2.resource.jwk.");
 | 
			
		||||
			String keyUri = resolver.getProperty("key-set-uri");
 | 
			
		||||
			Environment environment = context.getEnvironment();
 | 
			
		||||
			String keyUri = environment
 | 
			
		||||
					.getProperty("security.oauth2.resource.jwk.key-set-uri");
 | 
			
		||||
			if (StringUtils.hasText(keyUri)) {
 | 
			
		||||
				return ConditionOutcome
 | 
			
		||||
						.match(message.foundExactly("provided jwk key set URI"));
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -19,8 +19,10 @@ package org.springframework.boot.autoconfigure.session;
 | 
			
		|||
import org.springframework.boot.autoconfigure.condition.ConditionMessage;
 | 
			
		||||
import org.springframework.boot.autoconfigure.condition.ConditionOutcome;
 | 
			
		||||
import org.springframework.boot.autoconfigure.condition.SpringBootCondition;
 | 
			
		||||
import org.springframework.boot.bind.RelaxedPropertyResolver;
 | 
			
		||||
import org.springframework.boot.context.properties.bind.BindException;
 | 
			
		||||
import org.springframework.boot.context.properties.bind.Binder;
 | 
			
		||||
import org.springframework.context.annotation.ConditionContext;
 | 
			
		||||
import org.springframework.core.env.Environment;
 | 
			
		||||
import org.springframework.core.type.AnnotatedTypeMetadata;
 | 
			
		||||
import org.springframework.core.type.AnnotationMetadata;
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -29,6 +31,7 @@ import org.springframework.core.type.AnnotationMetadata;
 | 
			
		|||
 *
 | 
			
		||||
 * @author Tommy Ludwig
 | 
			
		||||
 * @author Stephane Nicoll
 | 
			
		||||
 * @author Madhura Bhave
 | 
			
		||||
 */
 | 
			
		||||
class SessionCondition extends SpringBootCondition {
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -37,21 +40,25 @@ class SessionCondition extends SpringBootCondition {
 | 
			
		|||
			AnnotatedTypeMetadata metadata) {
 | 
			
		||||
		ConditionMessage.Builder message = ConditionMessage
 | 
			
		||||
				.forCondition("Session Condition");
 | 
			
		||||
		RelaxedPropertyResolver resolver = new RelaxedPropertyResolver(
 | 
			
		||||
				context.getEnvironment(), "spring.session.");
 | 
			
		||||
		StoreType sessionStoreType = SessionStoreMappings
 | 
			
		||||
		Environment environment = context.getEnvironment();
 | 
			
		||||
		StoreType required = SessionStoreMappings
 | 
			
		||||
				.getType(((AnnotationMetadata) metadata).getClassName());
 | 
			
		||||
		if (!resolver.containsProperty("store-type")) {
 | 
			
		||||
		if (!environment.containsProperty("spring.session.store-type")) {
 | 
			
		||||
			return ConditionOutcome.noMatch(
 | 
			
		||||
					message.didNotFind("spring.session.store-type property").atAll());
 | 
			
		||||
		}
 | 
			
		||||
		String value = resolver.getProperty("store-type").replace('-', '_').toUpperCase();
 | 
			
		||||
		if (value.equals(sessionStoreType.name())) {
 | 
			
		||||
			return ConditionOutcome.match(message
 | 
			
		||||
					.found("spring.session.store-type property").items(sessionStoreType));
 | 
			
		||||
		try {
 | 
			
		||||
			Binder binder = Binder.get(environment);
 | 
			
		||||
			return binder.bind("spring.session.store-type", StoreType.class)
 | 
			
		||||
					.map((t) -> new ConditionOutcome(t == required,
 | 
			
		||||
							message.found("spring.session.store-type property").items(t)))
 | 
			
		||||
					.orElse(ConditionOutcome.noMatch(message
 | 
			
		||||
							.didNotFind("spring.session.store-type property").atAll()));
 | 
			
		||||
		}
 | 
			
		||||
		catch (BindException ex) {
 | 
			
		||||
			return ConditionOutcome.noMatch(
 | 
			
		||||
					message.found("invalid spring.session.store-type property").atAll());
 | 
			
		||||
		}
 | 
			
		||||
		return ConditionOutcome.noMatch(
 | 
			
		||||
				message.found("spring.session.store-type property").items(value));
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -18,10 +18,8 @@ package org.springframework.boot.autoconfigure.template;
 | 
			
		|||
 | 
			
		||||
import java.util.List;
 | 
			
		||||
 | 
			
		||||
import org.springframework.beans.BeanUtils;
 | 
			
		||||
import org.springframework.boot.bind.PropertySourcesPropertyValues;
 | 
			
		||||
import org.springframework.boot.bind.RelaxedDataBinder;
 | 
			
		||||
import org.springframework.core.env.ConfigurableEnvironment;
 | 
			
		||||
import org.springframework.boot.autoconfigure.template.PathBasedTemplateAvailabilityProvider.TemplateAvailabilityProperties;
 | 
			
		||||
import org.springframework.boot.context.properties.bind.Binder;
 | 
			
		||||
import org.springframework.core.env.Environment;
 | 
			
		||||
import org.springframework.core.io.ResourceLoader;
 | 
			
		||||
import org.springframework.util.ClassUtils;
 | 
			
		||||
| 
						 | 
				
			
			@ -32,20 +30,20 @@ import org.springframework.util.ClassUtils;
 | 
			
		|||
 *
 | 
			
		||||
 * @author Andy Wilkinson
 | 
			
		||||
 * @author Phillip Webb
 | 
			
		||||
 * @author Madhura Bhave
 | 
			
		||||
 * @since 1.4.6
 | 
			
		||||
 */
 | 
			
		||||
public abstract class PathBasedTemplateAvailabilityProvider
 | 
			
		||||
public abstract class PathBasedTemplateAvailabilityProvider<T extends TemplateAvailabilityProperties>
 | 
			
		||||
		implements TemplateAvailabilityProvider {
 | 
			
		||||
 | 
			
		||||
	private final String className;
 | 
			
		||||
 | 
			
		||||
	private final Class<? extends TemplateAvailabilityProperties> propertiesClass;
 | 
			
		||||
	private final Class<T> propertiesClass;
 | 
			
		||||
 | 
			
		||||
	private final String propertyPrefix;
 | 
			
		||||
 | 
			
		||||
	public PathBasedTemplateAvailabilityProvider(String className,
 | 
			
		||||
			Class<? extends TemplateAvailabilityProperties> propertiesClass,
 | 
			
		||||
			String propertyPrefix) {
 | 
			
		||||
			Class<T> propertiesClass, String propertyPrefix) {
 | 
			
		||||
		this.className = className;
 | 
			
		||||
		this.propertiesClass = propertiesClass;
 | 
			
		||||
		this.propertyPrefix = propertyPrefix;
 | 
			
		||||
| 
						 | 
				
			
			@ -55,12 +53,10 @@ public abstract class PathBasedTemplateAvailabilityProvider
 | 
			
		|||
	public boolean isTemplateAvailable(String view, Environment environment,
 | 
			
		||||
			ClassLoader classLoader, ResourceLoader resourceLoader) {
 | 
			
		||||
		if (ClassUtils.isPresent(this.className, classLoader)) {
 | 
			
		||||
			TemplateAvailabilityProperties properties = BeanUtils
 | 
			
		||||
					.instantiateClass(this.propertiesClass);
 | 
			
		||||
			RelaxedDataBinder binder = new RelaxedDataBinder(properties,
 | 
			
		||||
					this.propertyPrefix);
 | 
			
		||||
			binder.bind(new PropertySourcesPropertyValues(
 | 
			
		||||
					((ConfigurableEnvironment) environment).getPropertySources()));
 | 
			
		||||
			Binder binder = Binder.get(environment);
 | 
			
		||||
			TemplateAvailabilityProperties properties = binder
 | 
			
		||||
					.bind(this.propertyPrefix, this.propertiesClass)
 | 
			
		||||
					.orElseCreate(this.propertiesClass);
 | 
			
		||||
			return isTemplateAvailable(view, resourceLoader, properties);
 | 
			
		||||
		}
 | 
			
		||||
		return false;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -23,7 +23,6 @@ import java.util.List;
 | 
			
		|||
import java.util.Map;
 | 
			
		||||
import java.util.concurrent.ConcurrentHashMap;
 | 
			
		||||
 | 
			
		||||
import org.springframework.boot.bind.RelaxedPropertyResolver;
 | 
			
		||||
import org.springframework.context.ApplicationContext;
 | 
			
		||||
import org.springframework.core.env.Environment;
 | 
			
		||||
import org.springframework.core.io.ResourceLoader;
 | 
			
		||||
| 
						 | 
				
			
			@ -36,6 +35,7 @@ import org.springframework.util.Assert;
 | 
			
		|||
 * {@code spring.template.provider.cache} property is set to {@code false}.
 | 
			
		||||
 *
 | 
			
		||||
 * @author Phillip Webb
 | 
			
		||||
 * @author Madhura Bhave
 | 
			
		||||
 * @since 1.4.0
 | 
			
		||||
 */
 | 
			
		||||
public class TemplateAvailabilityProviders {
 | 
			
		||||
| 
						 | 
				
			
			@ -134,10 +134,9 @@ public class TemplateAvailabilityProviders {
 | 
			
		|||
		Assert.notNull(environment, "Environment must not be null");
 | 
			
		||||
		Assert.notNull(classLoader, "ClassLoader must not be null");
 | 
			
		||||
		Assert.notNull(resourceLoader, "ResourceLoader must not be null");
 | 
			
		||||
 | 
			
		||||
		RelaxedPropertyResolver propertyResolver = new RelaxedPropertyResolver(
 | 
			
		||||
				environment, "spring.template.provider.");
 | 
			
		||||
		if (!propertyResolver.getProperty("cache", Boolean.class, true)) {
 | 
			
		||||
		Boolean useCache = environment.getProperty("spring.template.provider.cache",
 | 
			
		||||
				Boolean.class, true);
 | 
			
		||||
		if (!useCache) {
 | 
			
		||||
			return findProvider(view, environment, classLoader, resourceLoader);
 | 
			
		||||
		}
 | 
			
		||||
		TemplateAvailabilityProvider provider = this.resolved.get(view);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -17,9 +17,7 @@
 | 
			
		|||
package org.springframework.boot.autoconfigure.thymeleaf;
 | 
			
		||||
 | 
			
		||||
import org.springframework.boot.autoconfigure.template.TemplateAvailabilityProvider;
 | 
			
		||||
import org.springframework.boot.bind.RelaxedPropertyResolver;
 | 
			
		||||
import org.springframework.core.env.Environment;
 | 
			
		||||
import org.springframework.core.env.PropertyResolver;
 | 
			
		||||
import org.springframework.core.io.ResourceLoader;
 | 
			
		||||
import org.springframework.util.ClassUtils;
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -28,6 +26,7 @@ import org.springframework.util.ClassUtils;
 | 
			
		|||
 * Thymeleaf view templates.
 | 
			
		||||
 *
 | 
			
		||||
 * @author Andy Wilkinson
 | 
			
		||||
 * @author Madhura Bhave
 | 
			
		||||
 * @since 1.1.0
 | 
			
		||||
 */
 | 
			
		||||
public class ThymeleafTemplateAvailabilityProvider
 | 
			
		||||
| 
						 | 
				
			
			@ -38,11 +37,9 @@ public class ThymeleafTemplateAvailabilityProvider
 | 
			
		|||
			ClassLoader classLoader, ResourceLoader resourceLoader) {
 | 
			
		||||
		if (ClassUtils.isPresent("org.thymeleaf.spring5.SpringTemplateEngine",
 | 
			
		||||
				classLoader)) {
 | 
			
		||||
			PropertyResolver resolver = new RelaxedPropertyResolver(environment,
 | 
			
		||||
					"spring.thymeleaf.");
 | 
			
		||||
			String prefix = resolver.getProperty("prefix",
 | 
			
		||||
			String prefix = environment.getProperty("spring.thymeleaf.prefix",
 | 
			
		||||
					ThymeleafProperties.DEFAULT_PREFIX);
 | 
			
		||||
			String suffix = resolver.getProperty("suffix",
 | 
			
		||||
			String suffix = environment.getProperty("spring.thymeleaf.suffix",
 | 
			
		||||
					ThymeleafProperties.DEFAULT_SUFFIX);
 | 
			
		||||
			return resourceLoader.getResource(prefix + view + suffix).exists();
 | 
			
		||||
		}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -24,7 +24,6 @@ import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
 | 
			
		|||
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
 | 
			
		||||
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
 | 
			
		||||
import org.springframework.boot.autoconfigure.condition.ConditionalOnResource;
 | 
			
		||||
import org.springframework.boot.bind.RelaxedPropertyResolver;
 | 
			
		||||
import org.springframework.context.annotation.Bean;
 | 
			
		||||
import org.springframework.context.annotation.Configuration;
 | 
			
		||||
import org.springframework.context.annotation.Import;
 | 
			
		||||
| 
						 | 
				
			
			@ -36,6 +35,7 @@ import org.springframework.validation.beanvalidation.MethodValidationPostProcess
 | 
			
		|||
 * infrastructure.
 | 
			
		||||
 *
 | 
			
		||||
 * @author Stephane Nicoll
 | 
			
		||||
 * @author Madhura Bhave
 | 
			
		||||
 * @since 1.5.0
 | 
			
		||||
 */
 | 
			
		||||
@Configuration
 | 
			
		||||
| 
						 | 
				
			
			@ -51,16 +51,11 @@ public class ValidationAutoConfiguration {
 | 
			
		|||
	public static MethodValidationPostProcessor methodValidationPostProcessor(
 | 
			
		||||
			Environment environment, Validator validator) {
 | 
			
		||||
		MethodValidationPostProcessor processor = new MethodValidationPostProcessor();
 | 
			
		||||
		processor.setProxyTargetClass(determineProxyTargetClass(environment));
 | 
			
		||||
		boolean proxyTargetClass = environment
 | 
			
		||||
				.getProperty("spring.aop.proxy-target-class", Boolean.class, true);
 | 
			
		||||
		processor.setProxyTargetClass(proxyTargetClass);
 | 
			
		||||
		processor.setValidator(validator);
 | 
			
		||||
		return processor;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	private static boolean determineProxyTargetClass(Environment environment) {
 | 
			
		||||
		RelaxedPropertyResolver resolver = new RelaxedPropertyResolver(environment,
 | 
			
		||||
				"spring.aop.");
 | 
			
		||||
		Boolean value = resolver.getProperty("proxyTargetClass", Boolean.class);
 | 
			
		||||
		return (value != null ? value : true);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -19,11 +19,9 @@ package org.springframework.boot.autoconfigure.web;
 | 
			
		|||
import org.springframework.boot.autoconfigure.condition.ConditionMessage;
 | 
			
		||||
import org.springframework.boot.autoconfigure.condition.ConditionOutcome;
 | 
			
		||||
import org.springframework.boot.autoconfigure.condition.SpringBootCondition;
 | 
			
		||||
import org.springframework.boot.bind.RelaxedPropertyResolver;
 | 
			
		||||
import org.springframework.context.annotation.Condition;
 | 
			
		||||
import org.springframework.context.annotation.ConditionContext;
 | 
			
		||||
import org.springframework.core.env.ConfigurableEnvironment;
 | 
			
		||||
import org.springframework.core.env.PropertyResolver;
 | 
			
		||||
import org.springframework.core.type.AnnotatedTypeMetadata;
 | 
			
		||||
import org.springframework.util.ClassUtils;
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -33,6 +31,7 @@ import org.springframework.util.ClassUtils;
 | 
			
		|||
 *
 | 
			
		||||
 * @author Stephane Nicoll
 | 
			
		||||
 * @author Phillip Webb
 | 
			
		||||
 * @author Madhura Bhave
 | 
			
		||||
 * @see ConditionalOnEnabledResourceChain
 | 
			
		||||
 */
 | 
			
		||||
class OnEnabledResourceChainCondition extends SpringBootCondition {
 | 
			
		||||
| 
						 | 
				
			
			@ -66,9 +65,8 @@ class OnEnabledResourceChainCondition extends SpringBootCondition {
 | 
			
		|||
 | 
			
		||||
	private Boolean getEnabledProperty(ConfigurableEnvironment environment, String key,
 | 
			
		||||
			Boolean defaultValue) {
 | 
			
		||||
		PropertyResolver resolver = new RelaxedPropertyResolver(environment,
 | 
			
		||||
				"spring.resources.chain." + key);
 | 
			
		||||
		return resolver.getProperty("enabled", Boolean.class, defaultValue);
 | 
			
		||||
		String name = "spring.resources.chain." + key + "enabled";
 | 
			
		||||
		return environment.getProperty(name, Boolean.class, defaultValue);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -17,9 +17,7 @@
 | 
			
		|||
package org.springframework.boot.autoconfigure.web.servlet;
 | 
			
		||||
 | 
			
		||||
import org.springframework.boot.autoconfigure.template.TemplateAvailabilityProvider;
 | 
			
		||||
import org.springframework.boot.bind.RelaxedPropertyResolver;
 | 
			
		||||
import org.springframework.core.env.Environment;
 | 
			
		||||
import org.springframework.core.env.PropertyResolver;
 | 
			
		||||
import org.springframework.core.io.ResourceLoader;
 | 
			
		||||
import org.springframework.util.ClassUtils;
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -29,6 +27,7 @@ import org.springframework.util.ClassUtils;
 | 
			
		|||
 *
 | 
			
		||||
 * @author Andy Wilkinson
 | 
			
		||||
 * @author Stephane Nicoll
 | 
			
		||||
 * @author Madhura Bhave
 | 
			
		||||
 * @since 1.1.0
 | 
			
		||||
 */
 | 
			
		||||
public class JspTemplateAvailabilityProvider implements TemplateAvailabilityProvider {
 | 
			
		||||
| 
						 | 
				
			
			@ -44,11 +43,9 @@ public class JspTemplateAvailabilityProvider implements TemplateAvailabilityProv
 | 
			
		|||
	}
 | 
			
		||||
 | 
			
		||||
	private String getResourceName(String view, Environment environment) {
 | 
			
		||||
		PropertyResolver resolver = new RelaxedPropertyResolver(environment,
 | 
			
		||||
				"spring.mvc.view.");
 | 
			
		||||
		String prefix = resolver.getProperty("prefix",
 | 
			
		||||
		String prefix = environment.getProperty("spring.mvc.view.prefix",
 | 
			
		||||
				WebMvcAutoConfiguration.DEFAULT_PREFIX);
 | 
			
		||||
		String suffix = resolver.getProperty("suffix",
 | 
			
		||||
		String suffix = environment.getProperty("spring.mvc.view.suffix",
 | 
			
		||||
				WebMvcAutoConfiguration.DEFAULT_SUFFIX);
 | 
			
		||||
		return prefix + view + suffix;
 | 
			
		||||
	}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -145,8 +145,7 @@ public class CacheAutoConfigurationTests {
 | 
			
		|||
	@Test
 | 
			
		||||
	public void notSupportedCachingMode() {
 | 
			
		||||
		this.thrown.expect(BeanCreationException.class);
 | 
			
		||||
		this.thrown.expectMessage("cache");
 | 
			
		||||
		this.thrown.expectMessage("foobar");
 | 
			
		||||
		this.thrown.expectMessage("Failed to bind properties under 'spring.cache.type'");
 | 
			
		||||
		load(DefaultCacheConfiguration.class, "spring.cache.type=foobar");
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,5 +1,5 @@
 | 
			
		|||
/*
 | 
			
		||||
 * Copyright 2012-2016 the original author or authors.
 | 
			
		||||
 * Copyright 2012-2017 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.
 | 
			
		||||
| 
						 | 
				
			
			@ -26,10 +26,14 @@ import org.junit.Rule;
 | 
			
		|||
import org.junit.Test;
 | 
			
		||||
import org.junit.rules.ExpectedException;
 | 
			
		||||
 | 
			
		||||
import org.springframework.boot.WebApplicationType;
 | 
			
		||||
import org.springframework.boot.builder.SpringApplicationBuilder;
 | 
			
		||||
import org.springframework.boot.test.util.EnvironmentTestUtils;
 | 
			
		||||
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
 | 
			
		||||
import org.springframework.context.ConfigurableApplicationContext;
 | 
			
		||||
import org.springframework.context.annotation.Bean;
 | 
			
		||||
import org.springframework.context.annotation.Configuration;
 | 
			
		||||
import org.springframework.core.env.ConfigurableEnvironment;
 | 
			
		||||
import org.springframework.core.env.StandardEnvironment;
 | 
			
		||||
 | 
			
		||||
import static org.assertj.core.api.Assertions.assertThat;
 | 
			
		||||
import static org.hamcrest.Matchers.containsString;
 | 
			
		||||
| 
						 | 
				
			
			@ -48,7 +52,9 @@ public class ConditionalOnPropertyTests {
 | 
			
		|||
	@Rule
 | 
			
		||||
	public ExpectedException thrown = ExpectedException.none();
 | 
			
		||||
 | 
			
		||||
	private AnnotationConfigApplicationContext context;
 | 
			
		||||
	private ConfigurableApplicationContext context;
 | 
			
		||||
 | 
			
		||||
	private ConfigurableEnvironment environment = new StandardEnvironment();
 | 
			
		||||
 | 
			
		||||
	@After
 | 
			
		||||
	public void tearDown() {
 | 
			
		||||
| 
						 | 
				
			
			@ -98,13 +104,6 @@ public class ConditionalOnPropertyTests {
 | 
			
		|||
		assertThat(this.context.containsBean("foo")).isTrue();
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	@Test
 | 
			
		||||
	public void nonRelaxedName() throws Exception {
 | 
			
		||||
		load(NonRelaxedPropertiesRequiredConfiguration.class,
 | 
			
		||||
				"theRelaxedProperty=value1");
 | 
			
		||||
		assertThat(this.context.containsBean("foo")).isFalse();
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	@Test
 | 
			
		||||
	// Enabled by default
 | 
			
		||||
	public void enabledIfNotConfiguredOtherwise() {
 | 
			
		||||
| 
						 | 
				
			
			@ -185,18 +184,6 @@ public class ConditionalOnPropertyTests {
 | 
			
		|||
		assertThat(this.context.containsBean("foo")).isTrue();
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	@Test
 | 
			
		||||
	public void strictNameMatch() {
 | 
			
		||||
		load(StrictNameConfig.class, "simple.my-property:bar");
 | 
			
		||||
		assertThat(this.context.containsBean("foo")).isTrue();
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	@Test
 | 
			
		||||
	public void strictNameNoMatch() {
 | 
			
		||||
		load(StrictNameConfig.class, "simple.myProperty:bar");
 | 
			
		||||
		assertThat(this.context.containsBean("foo")).isFalse();
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	@Test
 | 
			
		||||
	public void multiValuesAllSet() {
 | 
			
		||||
		load(MultiValuesConfig.class, "simple.my-property:bar",
 | 
			
		||||
| 
						 | 
				
			
			@ -271,10 +258,9 @@ public class ConditionalOnPropertyTests {
 | 
			
		|||
	}
 | 
			
		||||
 | 
			
		||||
	private void load(Class<?> config, String... environment) {
 | 
			
		||||
		this.context = new AnnotationConfigApplicationContext();
 | 
			
		||||
		EnvironmentTestUtils.addEnvironment(this.context, environment);
 | 
			
		||||
		this.context.register(config);
 | 
			
		||||
		this.context.refresh();
 | 
			
		||||
		EnvironmentTestUtils.addEnvironment(this.environment, environment);
 | 
			
		||||
		this.context = new SpringApplicationBuilder(config).environment(this.environment)
 | 
			
		||||
				.web(WebApplicationType.NONE).run();
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	@Configuration
 | 
			
		||||
| 
						 | 
				
			
			@ -310,17 +296,6 @@ public class ConditionalOnPropertyTests {
 | 
			
		|||
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	@Configuration
 | 
			
		||||
	@ConditionalOnProperty(name = "the-relaxed-property", relaxedNames = false)
 | 
			
		||||
	protected static class NonRelaxedPropertiesRequiredConfiguration {
 | 
			
		||||
 | 
			
		||||
		@Bean
 | 
			
		||||
		public String foo() {
 | 
			
		||||
			return "foo";
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	@Configuration
 | 
			
		||||
	// i.e ${simple.myProperty:true}
 | 
			
		||||
	@ConditionalOnProperty(prefix = "simple", name = "my-property", havingValue = "true", matchIfMissing = true)
 | 
			
		||||
| 
						 | 
				
			
			@ -378,17 +353,6 @@ public class ConditionalOnPropertyTests {
 | 
			
		|||
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	@Configuration
 | 
			
		||||
	@ConditionalOnProperty(prefix = "simple", name = "my-property", havingValue = "bar", relaxedNames = false)
 | 
			
		||||
	static class StrictNameConfig {
 | 
			
		||||
 | 
			
		||||
		@Bean
 | 
			
		||||
		public String foo() {
 | 
			
		||||
			return "foo";
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	@Configuration
 | 
			
		||||
	@ConditionalOnProperty(prefix = "simple", name = { "my-property",
 | 
			
		||||
			"my-another-property" }, havingValue = "bar")
 | 
			
		||||
| 
						 | 
				
			
			@ -434,6 +398,7 @@ public class ConditionalOnPropertyTests {
 | 
			
		|||
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	@Configuration
 | 
			
		||||
	@ConditionalOnMyFeature
 | 
			
		||||
	protected static class MetaAnnotation {
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -444,6 +409,7 @@ public class ConditionalOnPropertyTests {
 | 
			
		|||
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	@Configuration
 | 
			
		||||
	@ConditionalOnMyFeature
 | 
			
		||||
	@ConditionalOnProperty(prefix = "my.other.feature", name = "enabled", havingValue = "true", matchIfMissing = false)
 | 
			
		||||
	protected static class MetaAnnotationAndDirectAnnotation {
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,5 +1,5 @@
 | 
			
		|||
/*
 | 
			
		||||
 * Copyright 2012-2016 the original author or authors.
 | 
			
		||||
 * Copyright 2012-2017 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.
 | 
			
		||||
| 
						 | 
				
			
			@ -96,7 +96,7 @@ public class ResourceConditionTests {
 | 
			
		|||
	private static class DefaultLocationResourceCondition extends ResourceCondition {
 | 
			
		||||
 | 
			
		||||
		DefaultLocationResourceCondition() {
 | 
			
		||||
			super("test", "spring.foo.test.", "config", "classpath:/logging.properties");
 | 
			
		||||
			super("test", "spring.foo.test.config", "classpath:/logging.properties");
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
	}
 | 
			
		||||
| 
						 | 
				
			
			@ -105,7 +105,7 @@ public class ResourceConditionTests {
 | 
			
		|||
			extends ResourceCondition {
 | 
			
		||||
 | 
			
		||||
		UnknownDefaultLocationResourceCondition() {
 | 
			
		||||
			super("test", "spring.foo.test", "config",
 | 
			
		||||
			super("test", "spring.foo.test.config",
 | 
			
		||||
					"classpath:/this-file-does-not-exist.xml");
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -67,7 +67,7 @@ public class PersistenceExceptionTranslationAutoConfigurationTests {
 | 
			
		|||
	public void exceptionTranslationPostProcessorCanBeConfiguredToUseJdkProxy() {
 | 
			
		||||
		this.context = new AnnotationConfigApplicationContext();
 | 
			
		||||
		EnvironmentTestUtils.addEnvironment(this.context,
 | 
			
		||||
				"spring.aop.proxyTargetClass=false");
 | 
			
		||||
				"spring.aop.proxy-target-class=false");
 | 
			
		||||
		this.context.register(PersistenceExceptionTranslationAutoConfiguration.class);
 | 
			
		||||
		this.context.refresh();
 | 
			
		||||
		Map<String, PersistenceExceptionTranslationPostProcessor> beans = this.context
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -81,7 +81,7 @@ public class H2ConsoleAutoConfigurationTests {
 | 
			
		|||
	@Test
 | 
			
		||||
	public void customPathMustBeginWithASlash() {
 | 
			
		||||
		this.thrown.expect(BeanCreationException.class);
 | 
			
		||||
		this.thrown.expectMessage("Path must start with /");
 | 
			
		||||
		this.thrown.expectMessage("Failed to bind properties under 'spring.h2.console'");
 | 
			
		||||
		this.context.register(H2ConsoleAutoConfiguration.class);
 | 
			
		||||
		EnvironmentTestUtils.addEnvironment(this.context,
 | 
			
		||||
				"spring.h2.console.enabled:true", "spring.h2.console.path:custom");
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -31,6 +31,7 @@ import org.springframework.boot.autoconfigure.jdbc.DataSourceTransactionManagerA
 | 
			
		|||
import org.springframework.boot.autoconfigure.jdbc.EmbeddedDataSourceConfiguration;
 | 
			
		||||
import org.springframework.boot.autoconfigure.jdbc.JdbcTemplateAutoConfiguration;
 | 
			
		||||
import org.springframework.boot.autoconfigure.jmx.JmxAutoConfiguration;
 | 
			
		||||
import org.springframework.boot.context.properties.source.ConfigurationPropertySources;
 | 
			
		||||
import org.springframework.boot.test.util.EnvironmentTestUtils;
 | 
			
		||||
import org.springframework.context.ConfigurableApplicationContext;
 | 
			
		||||
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
 | 
			
		||||
| 
						 | 
				
			
			@ -99,11 +100,12 @@ public class IntegrationAutoConfigurationTests {
 | 
			
		|||
		load();
 | 
			
		||||
		AnnotationConfigApplicationContext parent = this.context;
 | 
			
		||||
		this.context = new AnnotationConfigApplicationContext();
 | 
			
		||||
		ConfigurationPropertySources.attach(this.context.getEnvironment());
 | 
			
		||||
		this.context.setParent(parent);
 | 
			
		||||
		this.context.register(JmxAutoConfiguration.class,
 | 
			
		||||
				IntegrationAutoConfiguration.class);
 | 
			
		||||
		TestPropertySourceUtils.addInlinedPropertiesToEnvironment(this.context,
 | 
			
		||||
				"SPRING_JMX_DEFAULT_DOMAIN=org.foo");
 | 
			
		||||
				"spring.jmx.default_domain=org.foo");
 | 
			
		||||
		this.context.refresh();
 | 
			
		||||
		assertThat(this.context.getBean(HeaderChannelRegistry.class)).isNotNull();
 | 
			
		||||
	}
 | 
			
		||||
| 
						 | 
				
			
			@ -129,7 +131,7 @@ public class IntegrationAutoConfigurationTests {
 | 
			
		|||
 | 
			
		||||
	@Test
 | 
			
		||||
	public void customizeJmxDomain() {
 | 
			
		||||
		load("SPRING_JMX_DEFAULT_DOMAIN=org.foo");
 | 
			
		||||
		load("spring.jmx.default_domain=org.foo");
 | 
			
		||||
		MBeanServer mBeanServer = this.context.getBean(MBeanServer.class);
 | 
			
		||||
		assertDomains(mBeanServer, true, "org.foo");
 | 
			
		||||
		assertDomains(mBeanServer, false, "org.springframework.integration",
 | 
			
		||||
| 
						 | 
				
			
			@ -209,6 +211,8 @@ public class IntegrationAutoConfigurationTests {
 | 
			
		|||
		if (configs != null) {
 | 
			
		||||
			ctx.register(configs);
 | 
			
		||||
		}
 | 
			
		||||
		TestPropertySourceUtils.addInlinedPropertiesToEnvironment(ctx, environment);
 | 
			
		||||
		ConfigurationPropertySources.attach(ctx.getEnvironment());
 | 
			
		||||
		ctx.register(JmxAutoConfiguration.class, IntegrationAutoConfiguration.class);
 | 
			
		||||
		ctx.refresh();
 | 
			
		||||
		this.context = ctx;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,5 +1,5 @@
 | 
			
		|||
/*
 | 
			
		||||
 * Copyright 2012-2016 the original author or authors.
 | 
			
		||||
 * Copyright 2012-2017 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.
 | 
			
		||||
| 
						 | 
				
			
			@ -65,13 +65,12 @@ public class XADataSourceAutoConfigurationTests {
 | 
			
		|||
	public void createFromClass() throws Exception {
 | 
			
		||||
		ApplicationContext context = createContext(FromProperties.class,
 | 
			
		||||
				"spring.datasource.xa.data-source-class-name:org.hsqldb.jdbc.pool.JDBCXADataSource",
 | 
			
		||||
				"spring.datasource.xa.properties.database-name:test");
 | 
			
		||||
				"spring.datasource.xa.properties.login-timeout:123");
 | 
			
		||||
		context.getBean(DataSource.class);
 | 
			
		||||
		MockXADataSourceWrapper wrapper = context.getBean(MockXADataSourceWrapper.class);
 | 
			
		||||
		JDBCXADataSource dataSource = (JDBCXADataSource) wrapper.getXaDataSource();
 | 
			
		||||
		assertThat(dataSource).isNotNull();
 | 
			
		||||
		assertThat(dataSource.getDatabaseName()).isEqualTo("test");
 | 
			
		||||
 | 
			
		||||
		assertThat(dataSource.getLoginTimeout()).isEqualTo(123);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	private ApplicationContext createContext(Class<?> configuration, String... env) {
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -40,7 +40,7 @@ import static org.assertj.core.api.Assertions.assertThat;
 | 
			
		|||
 */
 | 
			
		||||
@RunWith(SpringRunner.class)
 | 
			
		||||
@DirtiesContext
 | 
			
		||||
@SpringBootTest(webEnvironment = WebEnvironment.NONE, properties = { "env.foo=There",
 | 
			
		||||
@SpringBootTest(webEnvironment = WebEnvironment.NONE, properties = { "env.FOO=There",
 | 
			
		||||
		"foo=World" })
 | 
			
		||||
public class MustacheStandaloneIntegrationTests {
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -37,6 +37,7 @@ import org.springframework.boot.autoconfigure.jdbc.DataSourceTransactionManagerA
 | 
			
		|||
import org.springframework.boot.autoconfigure.jdbc.EmbeddedDataSourceConfiguration;
 | 
			
		||||
import org.springframework.boot.autoconfigure.orm.jpa.test.City;
 | 
			
		||||
import org.springframework.boot.autoconfigure.transaction.TransactionAutoConfiguration;
 | 
			
		||||
import org.springframework.boot.context.properties.source.ConfigurationPropertySources;
 | 
			
		||||
import org.springframework.boot.test.util.EnvironmentTestUtils;
 | 
			
		||||
import org.springframework.context.ApplicationContext;
 | 
			
		||||
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
 | 
			
		||||
| 
						 | 
				
			
			@ -131,6 +132,7 @@ public abstract class AbstractJpaAutoConfigurationTests {
 | 
			
		|||
		EnvironmentTestUtils.addEnvironment(context, "spring.jpa.open_in_view:false");
 | 
			
		||||
		context.register(TestConfiguration.class, EmbeddedDataSourceConfiguration.class,
 | 
			
		||||
				PropertyPlaceholderAutoConfiguration.class, getAutoConfigureClass());
 | 
			
		||||
		ConfigurationPropertySources.attach(context.getEnvironment());
 | 
			
		||||
		context.refresh();
 | 
			
		||||
		assertThat(getInterceptorBeans(context).length).isEqualTo(0);
 | 
			
		||||
		context.close();
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -38,6 +38,7 @@ import org.springframework.boot.autoconfigure.security.oauth2.resource.OAuth2Res
 | 
			
		|||
import org.springframework.boot.autoconfigure.security.oauth2.resource.ResourceServerProperties;
 | 
			
		||||
import org.springframework.boot.autoconfigure.web.servlet.DispatcherServletAutoConfiguration;
 | 
			
		||||
import org.springframework.boot.autoconfigure.web.servlet.WebMvcAutoConfiguration;
 | 
			
		||||
import org.springframework.boot.context.properties.source.ConfigurationPropertySources;
 | 
			
		||||
import org.springframework.boot.test.util.EnvironmentTestUtils;
 | 
			
		||||
import org.springframework.boot.test.web.client.TestRestTemplate;
 | 
			
		||||
import org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory;
 | 
			
		||||
| 
						 | 
				
			
			@ -244,6 +245,7 @@ public class OAuth2AutoConfigurationTests {
 | 
			
		|||
		EnvironmentTestUtils.addEnvironment(this.context,
 | 
			
		||||
				"security.oauth2.client.clientId=client",
 | 
			
		||||
				"security.oauth2.client.grantType=client_credentials");
 | 
			
		||||
		ConfigurationPropertySources.attach(this.context.getEnvironment());
 | 
			
		||||
		this.context.refresh();
 | 
			
		||||
		OAuth2ClientContext bean = this.context.getBean(OAuth2ClientContext.class);
 | 
			
		||||
		assertThat(bean.getAccessTokenRequest()).isNotNull();
 | 
			
		||||
| 
						 | 
				
			
			@ -259,6 +261,7 @@ public class OAuth2AutoConfigurationTests {
 | 
			
		|||
		EnvironmentTestUtils.addEnvironment(this.context,
 | 
			
		||||
				"security.oauth2.client.clientId=client",
 | 
			
		||||
				"security.oauth2.client.grantType=client_credentials");
 | 
			
		||||
		ConfigurationPropertySources.attach(this.context.getEnvironment());
 | 
			
		||||
		this.context.refresh();
 | 
			
		||||
		// The primary context is fine (not session scoped):
 | 
			
		||||
		OAuth2ClientContext bean = this.context.getBean(OAuth2ClientContext.class);
 | 
			
		||||
| 
						 | 
				
			
			@ -291,6 +294,7 @@ public class OAuth2AutoConfigurationTests {
 | 
			
		|||
				MinimalSecureWebApplication.class);
 | 
			
		||||
		EnvironmentTestUtils.addEnvironment(this.context,
 | 
			
		||||
				"security.oauth2.resource.jwt.keyValue:DEADBEEF");
 | 
			
		||||
		ConfigurationPropertySources.attach(this.context.getEnvironment());
 | 
			
		||||
		this.context.refresh();
 | 
			
		||||
		assertThat(countBeans(RESOURCE_SERVER_CONFIG)).isEqualTo(1);
 | 
			
		||||
		assertThat(countBeans(AUTHORIZATION_SERVER_CONFIG)).isEqualTo(0);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -100,8 +100,7 @@ public class ResourceServerTokenServicesConfigurationTests {
 | 
			
		|||
	@Test
 | 
			
		||||
	public void useRemoteTokenServices() {
 | 
			
		||||
		EnvironmentTestUtils.addEnvironment(this.environment,
 | 
			
		||||
				"security.oauth2.resource.tokenInfoUri:http://example.com",
 | 
			
		||||
				"security.oauth2.resource.clientId=acme");
 | 
			
		||||
				"security.oauth2.resource.tokenInfoUri:http://example.com");
 | 
			
		||||
		this.context = new SpringApplicationBuilder(ResourceConfiguration.class)
 | 
			
		||||
				.environment(this.environment).web(WebApplicationType.NONE).run();
 | 
			
		||||
		RemoteTokenServices services = this.context.getBean(RemoteTokenServices.class);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,5 +1,5 @@
 | 
			
		|||
/*
 | 
			
		||||
 * Copyright 2012-2016 the original author or authors.
 | 
			
		||||
 * Copyright 2012-2017 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.
 | 
			
		||||
| 
						 | 
				
			
			@ -22,6 +22,7 @@ import org.junit.After;
 | 
			
		|||
import org.junit.Test;
 | 
			
		||||
 | 
			
		||||
import org.springframework.beans.factory.NoSuchBeanDefinitionException;
 | 
			
		||||
import org.springframework.boot.context.properties.source.ConfigurationPropertySources;
 | 
			
		||||
import org.springframework.boot.test.util.EnvironmentTestUtils;
 | 
			
		||||
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
 | 
			
		||||
import org.springframework.context.annotation.Bean;
 | 
			
		||||
| 
						 | 
				
			
			@ -93,6 +94,7 @@ public class SendGridAutoConfigurationTests {
 | 
			
		|||
	private void loadContext(Class<?> additionalConfiguration, String... environment) {
 | 
			
		||||
		this.context = new AnnotationConfigApplicationContext();
 | 
			
		||||
		EnvironmentTestUtils.addEnvironment(this.context, environment);
 | 
			
		||||
		ConfigurationPropertySources.attach(this.context.getEnvironment());
 | 
			
		||||
		this.context.register(SendGridAutoConfiguration.class);
 | 
			
		||||
		if (additionalConfiguration != null) {
 | 
			
		||||
			this.context.register(additionalConfiguration);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -91,10 +91,9 @@ public class SessionAutoConfigurationTests extends AbstractSessionAutoConfigurat
 | 
			
		|||
 | 
			
		||||
	@Test
 | 
			
		||||
	public void springSessionTimeoutIsNotAValidProperty() {
 | 
			
		||||
		this.thrown.expect(BeanCreationException.class);
 | 
			
		||||
		this.thrown.expectMessage("Could not bind");
 | 
			
		||||
		load("spring.session.store-type=hash-map", "spring.session.timeout=3000");
 | 
			
		||||
		MapSessionRepository repository = validateSessionRepository(
 | 
			
		||||
				MapSessionRepository.class);
 | 
			
		||||
		assertThat(getSessionTimeout(repository)).isNull();
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	@Test
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,5 +1,5 @@
 | 
			
		|||
/*
 | 
			
		||||
 * Copyright 2012-2016 the original author or authors.
 | 
			
		||||
 * Copyright 2012-2017 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.
 | 
			
		||||
| 
						 | 
				
			
			@ -18,6 +18,7 @@ package org.springframework.boot.autoconfigure.social;
 | 
			
		|||
 | 
			
		||||
import org.junit.Test;
 | 
			
		||||
 | 
			
		||||
import org.springframework.boot.context.properties.source.ConfigurationPropertySources;
 | 
			
		||||
import org.springframework.boot.test.util.EnvironmentTestUtils;
 | 
			
		||||
import org.springframework.social.facebook.api.Facebook;
 | 
			
		||||
import org.springframework.web.context.support.AnnotationConfigWebApplicationContext;
 | 
			
		||||
| 
						 | 
				
			
			@ -38,6 +39,7 @@ public class FacebookAutoConfigurationTests extends AbstractSocialAutoConfigurat
 | 
			
		|||
				"spring.social.facebook.appId:12345");
 | 
			
		||||
		EnvironmentTestUtils.addEnvironment(this.context,
 | 
			
		||||
				"spring.social.facebook.appSecret:secret");
 | 
			
		||||
		ConfigurationPropertySources.attach(this.context.getEnvironment());
 | 
			
		||||
		this.context.register(FacebookAutoConfiguration.class);
 | 
			
		||||
		this.context.register(SocialWebAutoConfiguration.class);
 | 
			
		||||
		this.context.refresh();
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,5 +1,5 @@
 | 
			
		|||
/*
 | 
			
		||||
 * Copyright 2012-2016 the original author or authors.
 | 
			
		||||
 * Copyright 2012-2017 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.
 | 
			
		||||
| 
						 | 
				
			
			@ -18,6 +18,7 @@ package org.springframework.boot.autoconfigure.social;
 | 
			
		|||
 | 
			
		||||
import org.junit.Test;
 | 
			
		||||
 | 
			
		||||
import org.springframework.boot.context.properties.source.ConfigurationPropertySources;
 | 
			
		||||
import org.springframework.boot.test.util.EnvironmentTestUtils;
 | 
			
		||||
import org.springframework.social.linkedin.api.LinkedIn;
 | 
			
		||||
import org.springframework.web.context.support.AnnotationConfigWebApplicationContext;
 | 
			
		||||
| 
						 | 
				
			
			@ -38,6 +39,7 @@ public class LinkedInAutoConfigurationTests extends AbstractSocialAutoConfigurat
 | 
			
		|||
				"spring.social.linkedin.appId:12345");
 | 
			
		||||
		EnvironmentTestUtils.addEnvironment(this.context,
 | 
			
		||||
				"spring.social.linkedin.appSecret:secret");
 | 
			
		||||
		ConfigurationPropertySources.attach(this.context.getEnvironment());
 | 
			
		||||
		this.context.register(LinkedInAutoConfiguration.class);
 | 
			
		||||
		this.context.register(SocialWebAutoConfiguration.class);
 | 
			
		||||
		this.context.refresh();
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,5 +1,5 @@
 | 
			
		|||
/*
 | 
			
		||||
 * Copyright 2012-2016 the original author or authors.
 | 
			
		||||
 * Copyright 2012-2017 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.
 | 
			
		||||
| 
						 | 
				
			
			@ -18,6 +18,7 @@ package org.springframework.boot.autoconfigure.social;
 | 
			
		|||
 | 
			
		||||
import org.junit.Test;
 | 
			
		||||
 | 
			
		||||
import org.springframework.boot.context.properties.source.ConfigurationPropertySources;
 | 
			
		||||
import org.springframework.boot.test.util.EnvironmentTestUtils;
 | 
			
		||||
import org.springframework.social.facebook.api.Facebook;
 | 
			
		||||
import org.springframework.social.linkedin.api.LinkedIn;
 | 
			
		||||
| 
						 | 
				
			
			@ -111,6 +112,7 @@ public class MultiApiAutoConfigurationTests extends AbstractSocialAutoConfigurat
 | 
			
		|||
	private void setupContext(String... environment) {
 | 
			
		||||
		this.context = new AnnotationConfigWebApplicationContext();
 | 
			
		||||
		EnvironmentTestUtils.addEnvironment(this.context, environment);
 | 
			
		||||
		ConfigurationPropertySources.attach(this.context.getEnvironment());
 | 
			
		||||
		this.context.register(TwitterAutoConfiguration.class);
 | 
			
		||||
		this.context.register(FacebookAutoConfiguration.class);
 | 
			
		||||
		this.context.register(LinkedInAutoConfiguration.class);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,5 +1,5 @@
 | 
			
		|||
/*
 | 
			
		||||
 * Copyright 2012-2016 the original author or authors.
 | 
			
		||||
 * Copyright 2012-2017 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.
 | 
			
		||||
| 
						 | 
				
			
			@ -18,6 +18,7 @@ package org.springframework.boot.autoconfigure.social;
 | 
			
		|||
 | 
			
		||||
import org.junit.Test;
 | 
			
		||||
 | 
			
		||||
import org.springframework.boot.context.properties.source.ConfigurationPropertySources;
 | 
			
		||||
import org.springframework.boot.test.util.EnvironmentTestUtils;
 | 
			
		||||
import org.springframework.social.twitter.api.Twitter;
 | 
			
		||||
import org.springframework.web.context.support.AnnotationConfigWebApplicationContext;
 | 
			
		||||
| 
						 | 
				
			
			@ -38,6 +39,7 @@ public class TwitterAutoConfigurationTests extends AbstractSocialAutoConfigurati
 | 
			
		|||
				"spring.social.twitter.appId:12345");
 | 
			
		||||
		EnvironmentTestUtils.addEnvironment(this.context,
 | 
			
		||||
				"spring.social.twitter.appSecret:secret");
 | 
			
		||||
		ConfigurationPropertySources.attach(this.context.getEnvironment());
 | 
			
		||||
		this.context.register(TwitterAutoConfiguration.class);
 | 
			
		||||
		this.context.register(SocialWebAutoConfiguration.class);
 | 
			
		||||
		this.context.refresh();
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -118,7 +118,7 @@ public class DispatcherServletAutoConfigurationTests {
 | 
			
		|||
		this.context = new AnnotationConfigWebApplicationContext();
 | 
			
		||||
		this.context.setServletContext(new MockServletContext());
 | 
			
		||||
		this.context.register(DispatcherServletAutoConfiguration.class);
 | 
			
		||||
		EnvironmentTestUtils.addEnvironment(this.context, "server.servlet_path:/spring");
 | 
			
		||||
		EnvironmentTestUtils.addEnvironment(this.context, "server.servlet.path:/spring");
 | 
			
		||||
		this.context.refresh();
 | 
			
		||||
		assertThat(this.context.getBean(DispatcherServlet.class)).isNotNull();
 | 
			
		||||
		ServletRegistrationBean<?> registration = this.context
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -332,7 +332,7 @@ public class WebMvcAutoConfigurationTests {
 | 
			
		|||
 | 
			
		||||
	@Test
 | 
			
		||||
	public void overrideDateFormat() throws Exception {
 | 
			
		||||
		load(AllResources.class, "spring.mvc.dateFormat:dd*MM*yyyy");
 | 
			
		||||
		load(AllResources.class, "spring.mvc.date-format:dd*MM*yyyy");
 | 
			
		||||
		FormattingConversionService cs = this.context
 | 
			
		||||
				.getBean(FormattingConversionService.class);
 | 
			
		||||
		Date date = new DateTime(1988, 6, 25, 20, 30).toDate();
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -59,7 +59,7 @@ public class WebServicesAutoConfigurationTests {
 | 
			
		|||
	@Test
 | 
			
		||||
	public void customPathMustBeginWithASlash() {
 | 
			
		||||
		this.thrown.expect(BeanCreationException.class);
 | 
			
		||||
		this.thrown.expectMessage("Path must start with /");
 | 
			
		||||
		this.thrown.expectMessage("Failed to bind properties under 'spring.webservices'");
 | 
			
		||||
		load(WebServicesAutoConfiguration.class, "spring.webservices.path=invalid");
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -21,7 +21,6 @@ import java.util.HashMap;
 | 
			
		|||
import java.util.Map;
 | 
			
		||||
 | 
			
		||||
import org.springframework.boot.SpringApplication;
 | 
			
		||||
import org.springframework.boot.bind.RelaxedPropertyResolver;
 | 
			
		||||
import org.springframework.boot.devtools.restart.Restarter;
 | 
			
		||||
import org.springframework.boot.env.EnvironmentPostProcessor;
 | 
			
		||||
import org.springframework.core.Ordered;
 | 
			
		||||
| 
						 | 
				
			
			@ -37,6 +36,7 @@ import org.springframework.core.env.PropertySource;
 | 
			
		|||
 *
 | 
			
		||||
 * @author Phillip Webb
 | 
			
		||||
 * @author Andy Wilkinson
 | 
			
		||||
 * @author Madhura Bhave
 | 
			
		||||
 * @since 1.3.0
 | 
			
		||||
 */
 | 
			
		||||
@Order(Ordered.LOWEST_PRECEDENCE)
 | 
			
		||||
| 
						 | 
				
			
			@ -90,9 +90,7 @@ public class DevToolsPropertyDefaultsPostProcessor implements EnvironmentPostPro
 | 
			
		|||
	}
 | 
			
		||||
 | 
			
		||||
	private boolean isRemoteRestartEnabled(Environment environment) {
 | 
			
		||||
		RelaxedPropertyResolver resolver = new RelaxedPropertyResolver(environment,
 | 
			
		||||
				"spring.devtools.remote.");
 | 
			
		||||
		return resolver.containsProperty("secret");
 | 
			
		||||
		return environment.containsProperty("spring.devtools.remote.secret");
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,5 +1,5 @@
 | 
			
		|||
/*
 | 
			
		||||
 * Copyright 2012-2016 the original author or authors.
 | 
			
		||||
 * Copyright 2012-2017 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.
 | 
			
		||||
| 
						 | 
				
			
			@ -21,7 +21,6 @@ import javax.net.ServerSocketFactory;
 | 
			
		|||
import org.springframework.boot.autoconfigure.condition.ConditionMessage;
 | 
			
		||||
import org.springframework.boot.autoconfigure.condition.ConditionOutcome;
 | 
			
		||||
import org.springframework.boot.autoconfigure.condition.SpringBootCondition;
 | 
			
		||||
import org.springframework.boot.bind.RelaxedPropertyResolver;
 | 
			
		||||
import org.springframework.boot.devtools.autoconfigure.RemoteDevToolsProperties;
 | 
			
		||||
import org.springframework.context.annotation.ConditionContext;
 | 
			
		||||
import org.springframework.core.type.AnnotatedTypeMetadata;
 | 
			
		||||
| 
						 | 
				
			
			@ -30,6 +29,7 @@ import org.springframework.core.type.AnnotatedTypeMetadata;
 | 
			
		|||
 * Condition used to check that the actual local port is available.
 | 
			
		||||
 *
 | 
			
		||||
 * @author Phillip Webb
 | 
			
		||||
 * @author Madhura Bhave
 | 
			
		||||
 */
 | 
			
		||||
class LocalDebugPortAvailableCondition extends SpringBootCondition {
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -38,12 +38,9 @@ class LocalDebugPortAvailableCondition extends SpringBootCondition {
 | 
			
		|||
			AnnotatedTypeMetadata metadata) {
 | 
			
		||||
		ConditionMessage.Builder message = ConditionMessage
 | 
			
		||||
				.forCondition("Local Debug Port Condition");
 | 
			
		||||
		RelaxedPropertyResolver resolver = new RelaxedPropertyResolver(
 | 
			
		||||
				context.getEnvironment(), "spring.devtools.remote.debug.");
 | 
			
		||||
		Integer port = resolver.getProperty("local-port", Integer.class);
 | 
			
		||||
		if (port == null) {
 | 
			
		||||
			port = RemoteDevToolsProperties.Debug.DEFAULT_LOCAL_PORT;
 | 
			
		||||
		}
 | 
			
		||||
		Integer port = context.getEnvironment().getProperty(
 | 
			
		||||
				"spring.devtools.remote.debug.local-port", Integer.class,
 | 
			
		||||
				RemoteDevToolsProperties.Debug.DEFAULT_LOCAL_PORT);
 | 
			
		||||
		if (isPortAvailable(port)) {
 | 
			
		||||
			return ConditionOutcome.match(message.foundExactly("local debug port"));
 | 
			
		||||
		}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,5 +1,5 @@
 | 
			
		|||
/*
 | 
			
		||||
 * Copyright 2012-2015 the original author or authors.
 | 
			
		||||
 * Copyright 2012-2017 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.
 | 
			
		||||
| 
						 | 
				
			
			@ -18,9 +18,11 @@ package sample.propertyvalidation;
 | 
			
		|||
 | 
			
		||||
import org.springframework.boot.context.properties.ConfigurationProperties;
 | 
			
		||||
import org.springframework.stereotype.Component;
 | 
			
		||||
import org.springframework.validation.annotation.Validated;
 | 
			
		||||
 | 
			
		||||
@Component
 | 
			
		||||
@ConfigurationProperties(prefix = "sample")
 | 
			
		||||
@Validated
 | 
			
		||||
public class SampleProperties {
 | 
			
		||||
 | 
			
		||||
	/**
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,5 +1,5 @@
 | 
			
		|||
/*
 | 
			
		||||
 * Copyright 2012-2016 the original author or authors.
 | 
			
		||||
 * Copyright 2012-2017 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.
 | 
			
		||||
| 
						 | 
				
			
			@ -63,7 +63,7 @@ public class SamplePropertyValidationApplicationTests {
 | 
			
		|||
		EnvironmentTestUtils.addEnvironment(this.context, "sample.host:xxxxxx",
 | 
			
		||||
				"sample.port:9090");
 | 
			
		||||
		this.thrown.expect(BeanCreationException.class);
 | 
			
		||||
		this.thrown.expectMessage("xxxxxx");
 | 
			
		||||
		this.thrown.expectMessage("Failed to bind properties under 'sample'");
 | 
			
		||||
		this.context.refresh();
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -71,8 +71,7 @@ public class SamplePropertyValidationApplicationTests {
 | 
			
		|||
	public void bindNullHost() {
 | 
			
		||||
		this.context.register(SamplePropertyValidationApplication.class);
 | 
			
		||||
		this.thrown.expect(BeanCreationException.class);
 | 
			
		||||
		this.thrown.expectMessage("null");
 | 
			
		||||
		this.thrown.expectMessage("host");
 | 
			
		||||
		this.thrown.expectMessage("Failed to bind properties under 'sample'");
 | 
			
		||||
		this.context.refresh();
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -21,13 +21,14 @@ import java.util.Arrays;
 | 
			
		|||
import java.util.Collections;
 | 
			
		||||
import java.util.LinkedHashSet;
 | 
			
		||||
import java.util.List;
 | 
			
		||||
import java.util.Map;
 | 
			
		||||
import java.util.Set;
 | 
			
		||||
 | 
			
		||||
import org.springframework.beans.BeanUtils;
 | 
			
		||||
import org.springframework.boot.SpringApplication;
 | 
			
		||||
import org.springframework.boot.WebApplicationType;
 | 
			
		||||
import org.springframework.boot.bind.RelaxedPropertyResolver;
 | 
			
		||||
import org.springframework.boot.context.properties.bind.Bindable;
 | 
			
		||||
import org.springframework.boot.context.properties.bind.Binder;
 | 
			
		||||
import org.springframework.boot.context.properties.source.MapConfigurationPropertySource;
 | 
			
		||||
import org.springframework.boot.test.mock.web.SpringBootMockServletContext;
 | 
			
		||||
import org.springframework.boot.test.util.EnvironmentTestUtils;
 | 
			
		||||
import org.springframework.boot.web.reactive.context.GenericReactiveWebApplicationContext;
 | 
			
		||||
| 
						 | 
				
			
			@ -40,10 +41,6 @@ import org.springframework.core.SpringVersion;
 | 
			
		|||
import org.springframework.core.annotation.AnnotatedElementUtils;
 | 
			
		||||
import org.springframework.core.annotation.Order;
 | 
			
		||||
import org.springframework.core.env.ConfigurableEnvironment;
 | 
			
		||||
import org.springframework.core.env.MapPropertySource;
 | 
			
		||||
import org.springframework.core.env.MutablePropertySources;
 | 
			
		||||
import org.springframework.core.env.PropertySources;
 | 
			
		||||
import org.springframework.core.env.PropertySourcesPropertyResolver;
 | 
			
		||||
import org.springframework.core.env.StandardEnvironment;
 | 
			
		||||
import org.springframework.core.io.DefaultResourceLoader;
 | 
			
		||||
import org.springframework.test.context.ContextConfigurationAttributes;
 | 
			
		||||
| 
						 | 
				
			
			@ -76,6 +73,7 @@ import org.springframework.web.context.support.GenericWebApplicationContext;
 | 
			
		|||
 * @author Phillip Webb
 | 
			
		||||
 * @author Andy Wilkinson
 | 
			
		||||
 * @author Stephane Nicoll
 | 
			
		||||
 * @author Madhura Bhave
 | 
			
		||||
 * @see SpringBootTest
 | 
			
		||||
 */
 | 
			
		||||
public class SpringBootContextLoader extends AbstractContextLoader {
 | 
			
		||||
| 
						 | 
				
			
			@ -171,19 +169,15 @@ public class SpringBootContextLoader extends AbstractContextLoader {
 | 
			
		|||
	}
 | 
			
		||||
 | 
			
		||||
	private boolean hasCustomServerPort(List<String> properties) {
 | 
			
		||||
		PropertySources sources = convertToPropertySources(properties);
 | 
			
		||||
		RelaxedPropertyResolver resolver = new RelaxedPropertyResolver(
 | 
			
		||||
				new PropertySourcesPropertyResolver(sources), "server.");
 | 
			
		||||
		return resolver.containsProperty("port");
 | 
			
		||||
		Binder binder = new Binder(convertToConfigurationPropertySource(properties));
 | 
			
		||||
		return binder.bind("server.port", Bindable.of(String.class)).isBound();
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	private PropertySources convertToPropertySources(List<String> properties) {
 | 
			
		||||
		Map<String, Object> source = TestPropertySourceUtils
 | 
			
		||||
				.convertInlinedPropertiesToMap(
 | 
			
		||||
						properties.toArray(new String[properties.size()]));
 | 
			
		||||
		MutablePropertySources sources = new MutablePropertySources();
 | 
			
		||||
		sources.addFirst(new MapPropertySource("inline", source));
 | 
			
		||||
		return sources;
 | 
			
		||||
	private MapConfigurationPropertySource convertToConfigurationPropertySource(
 | 
			
		||||
			List<String> properties) {
 | 
			
		||||
		String[] array = properties.toArray(new String[properties.size()]);
 | 
			
		||||
		return new MapConfigurationPropertySource(
 | 
			
		||||
				TestPropertySourceUtils.convertInlinedPropertiesToMap(array));
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	private List<ApplicationContextInitializer<?>> getInitializers(
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -21,7 +21,6 @@ import java.util.ArrayList;
 | 
			
		|||
import java.util.Arrays;
 | 
			
		||||
import java.util.HashSet;
 | 
			
		||||
import java.util.List;
 | 
			
		||||
import java.util.Map;
 | 
			
		||||
import java.util.Set;
 | 
			
		||||
 | 
			
		||||
import org.apache.commons.logging.Log;
 | 
			
		||||
| 
						 | 
				
			
			@ -29,15 +28,14 @@ import org.apache.commons.logging.LogFactory;
 | 
			
		|||
 | 
			
		||||
import org.springframework.boot.SpringBootConfiguration;
 | 
			
		||||
import org.springframework.boot.WebApplicationType;
 | 
			
		||||
import org.springframework.boot.bind.RelaxedPropertyResolver;
 | 
			
		||||
import org.springframework.boot.context.properties.bind.Bindable;
 | 
			
		||||
import org.springframework.boot.context.properties.bind.Binder;
 | 
			
		||||
import org.springframework.boot.context.properties.source.ConfigurationPropertySource;
 | 
			
		||||
import org.springframework.boot.context.properties.source.MapConfigurationPropertySource;
 | 
			
		||||
import org.springframework.boot.test.context.SpringBootTest.WebEnvironment;
 | 
			
		||||
import org.springframework.core.annotation.AnnotatedElementUtils;
 | 
			
		||||
import org.springframework.core.annotation.AnnotationUtils;
 | 
			
		||||
import org.springframework.core.env.Environment;
 | 
			
		||||
import org.springframework.core.env.MapPropertySource;
 | 
			
		||||
import org.springframework.core.env.MutablePropertySources;
 | 
			
		||||
import org.springframework.core.env.PropertySources;
 | 
			
		||||
import org.springframework.core.env.PropertySourcesPropertyResolver;
 | 
			
		||||
import org.springframework.core.io.support.SpringFactoriesLoader;
 | 
			
		||||
import org.springframework.test.context.ContextConfiguration;
 | 
			
		||||
import org.springframework.test.context.ContextConfigurationAttributes;
 | 
			
		||||
| 
						 | 
				
			
			@ -71,6 +69,7 @@ import org.springframework.util.ObjectUtils;
 | 
			
		|||
 * @author Phillip Webb
 | 
			
		||||
 * @author Andy Wilkinson
 | 
			
		||||
 * @author Brian Clozel
 | 
			
		||||
 * @author Madhura Bhave
 | 
			
		||||
 * @since 1.4.0
 | 
			
		||||
 * @see SpringBootTest
 | 
			
		||||
 * @see TestConfiguration
 | 
			
		||||
| 
						 | 
				
			
			@ -98,7 +97,7 @@ public class SpringBootTestContextBootstrapper extends DefaultTestContextBootstr
 | 
			
		|||
		verifyConfiguration(context.getTestClass());
 | 
			
		||||
		WebEnvironment webEnvironment = getWebEnvironment(context.getTestClass());
 | 
			
		||||
		if (webEnvironment == WebEnvironment.MOCK
 | 
			
		||||
				&& deduceWebApplication() == WebApplicationType.SERVLET) {
 | 
			
		||||
				&& deduceWebApplicationType() == WebApplicationType.SERVLET) {
 | 
			
		||||
			context.setAttribute(ACTIVATE_SERVLET_LISTENER, true);
 | 
			
		||||
		}
 | 
			
		||||
		else if (webEnvironment != null && webEnvironment.isEmbedded()) {
 | 
			
		||||
| 
						 | 
				
			
			@ -181,15 +180,17 @@ public class SpringBootTestContextBootstrapper extends DefaultTestContextBootstr
 | 
			
		|||
 | 
			
		||||
	private WebApplicationType getWebApplicationType(
 | 
			
		||||
			MergedContextConfiguration configuration) {
 | 
			
		||||
		WebApplicationType webApplicationType = getConfiguredWebApplicationType(
 | 
			
		||||
				configuration);
 | 
			
		||||
		if (webApplicationType != null) {
 | 
			
		||||
			return webApplicationType;
 | 
			
		||||
		}
 | 
			
		||||
		return deduceWebApplication();
 | 
			
		||||
		ConfigurationPropertySource source = new MapConfigurationPropertySource(
 | 
			
		||||
				TestPropertySourceUtils.convertInlinedPropertiesToMap(
 | 
			
		||||
						configuration.getPropertySourceProperties()));
 | 
			
		||||
		Binder binder = new Binder(source);
 | 
			
		||||
		return binder
 | 
			
		||||
				.bind("spring.main.web-application-type",
 | 
			
		||||
						Bindable.of(WebApplicationType.class))
 | 
			
		||||
				.orElseGet(this::deduceWebApplicationType);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	private WebApplicationType deduceWebApplication() {
 | 
			
		||||
	private WebApplicationType deduceWebApplicationType() {
 | 
			
		||||
		if (ClassUtils.isPresent(REACTIVE_WEB_ENVIRONMENT_CLASS, null)
 | 
			
		||||
				&& !ClassUtils.isPresent(MVC_WEB_ENVIRONMENT_CLASS, null)) {
 | 
			
		||||
			return WebApplicationType.REACTIVE;
 | 
			
		||||
| 
						 | 
				
			
			@ -228,25 +229,6 @@ public class SpringBootTestContextBootstrapper extends DefaultTestContextBootstr
 | 
			
		|||
		return false;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	private WebApplicationType getConfiguredWebApplicationType(
 | 
			
		||||
			MergedContextConfiguration configuration) {
 | 
			
		||||
		PropertySources sources = convertToPropertySources(
 | 
			
		||||
				configuration.getPropertySourceProperties());
 | 
			
		||||
		RelaxedPropertyResolver resolver = new RelaxedPropertyResolver(
 | 
			
		||||
				new PropertySourcesPropertyResolver(sources), "spring.main.");
 | 
			
		||||
		String property = resolver.getProperty("web-application-type");
 | 
			
		||||
		return (property != null ? WebApplicationType.valueOf(property.toUpperCase())
 | 
			
		||||
				: null);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	private PropertySources convertToPropertySources(String[] properties) {
 | 
			
		||||
		Map<String, Object> source = TestPropertySourceUtils
 | 
			
		||||
				.convertInlinedPropertiesToMap(properties);
 | 
			
		||||
		MutablePropertySources sources = new MutablePropertySources();
 | 
			
		||||
		sources.addFirst(new MapPropertySource("inline", source));
 | 
			
		||||
		return sources;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	protected Class<?>[] getOrFindConfigurationClasses(
 | 
			
		||||
			MergedContextConfiguration mergedConfig) {
 | 
			
		||||
		Class<?>[] classes = mergedConfig.getClasses();
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -16,7 +16,6 @@
 | 
			
		|||
 | 
			
		||||
package org.springframework.boot.test.web.client;
 | 
			
		||||
 | 
			
		||||
import org.springframework.boot.bind.RelaxedPropertyResolver;
 | 
			
		||||
import org.springframework.boot.web.client.RootUriTemplateHandler;
 | 
			
		||||
import org.springframework.core.env.Environment;
 | 
			
		||||
import org.springframework.util.Assert;
 | 
			
		||||
| 
						 | 
				
			
			@ -30,6 +29,7 @@ import org.springframework.web.util.UriTemplateHandler;
 | 
			
		|||
 * @author Phillip Webb
 | 
			
		||||
 * @author Andy Wilkinson
 | 
			
		||||
 * @author Eddú Meléndez
 | 
			
		||||
 * @author Madhura Bhave
 | 
			
		||||
 * @since 1.4.0
 | 
			
		||||
 */
 | 
			
		||||
public class LocalHostUriTemplateHandler extends RootUriTemplateHandler {
 | 
			
		||||
| 
						 | 
				
			
			@ -38,7 +38,7 @@ public class LocalHostUriTemplateHandler extends RootUriTemplateHandler {
 | 
			
		|||
 | 
			
		||||
	private final String scheme;
 | 
			
		||||
 | 
			
		||||
	private RelaxedPropertyResolver servletPropertyResolver;
 | 
			
		||||
	private final String prefix = "server.servlet.";
 | 
			
		||||
 | 
			
		||||
	/**
 | 
			
		||||
	 * Create a new {@code LocalHostUriTemplateHandler} that will generate {@code http}
 | 
			
		||||
| 
						 | 
				
			
			@ -63,14 +63,13 @@ public class LocalHostUriTemplateHandler extends RootUriTemplateHandler {
 | 
			
		|||
		Assert.notNull(scheme, "Scheme must not be null");
 | 
			
		||||
		this.environment = environment;
 | 
			
		||||
		this.scheme = scheme;
 | 
			
		||||
		this.servletPropertyResolver = new RelaxedPropertyResolver(environment,
 | 
			
		||||
				"server.servlet.");
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	@Override
 | 
			
		||||
	public String getRootUri() {
 | 
			
		||||
		String port = this.environment.getProperty("local.server.port", "8080");
 | 
			
		||||
		String contextPath = this.servletPropertyResolver.getProperty("context-path", "");
 | 
			
		||||
		String contextPath = this.environment.getProperty(this.prefix + "context-path",
 | 
			
		||||
				"");
 | 
			
		||||
		return this.scheme + "://localhost:" + port + contextPath;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,5 +1,5 @@
 | 
			
		|||
/*
 | 
			
		||||
 * Copyright 2012-2016 the original author or authors.
 | 
			
		||||
 * Copyright 2012-2017 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.
 | 
			
		||||
| 
						 | 
				
			
			@ -33,9 +33,7 @@ import org.springframework.boot.ansi.AnsiColor;
 | 
			
		|||
import org.springframework.boot.ansi.AnsiColors;
 | 
			
		||||
import org.springframework.boot.ansi.AnsiElement;
 | 
			
		||||
import org.springframework.boot.ansi.AnsiOutput;
 | 
			
		||||
import org.springframework.boot.bind.RelaxedPropertyResolver;
 | 
			
		||||
import org.springframework.core.env.Environment;
 | 
			
		||||
import org.springframework.core.env.PropertyResolver;
 | 
			
		||||
import org.springframework.core.io.Resource;
 | 
			
		||||
import org.springframework.util.Assert;
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -45,6 +43,7 @@ import org.springframework.util.Assert;
 | 
			
		|||
 *
 | 
			
		||||
 * @author Craig Burke
 | 
			
		||||
 * @author Phillip Webb
 | 
			
		||||
 * @author Madhura Bhave
 | 
			
		||||
 * @since 1.4.0
 | 
			
		||||
 */
 | 
			
		||||
public class ImageBanner implements Banner {
 | 
			
		||||
| 
						 | 
				
			
			@ -92,12 +91,11 @@ public class ImageBanner implements Banner {
 | 
			
		|||
 | 
			
		||||
	private void printBanner(Environment environment, PrintStream out)
 | 
			
		||||
			throws IOException {
 | 
			
		||||
		PropertyResolver properties = new RelaxedPropertyResolver(environment,
 | 
			
		||||
				"banner.image.");
 | 
			
		||||
		int width = properties.getProperty("width", Integer.class, 76);
 | 
			
		||||
		int height = properties.getProperty("height", Integer.class, 0);
 | 
			
		||||
		int margin = properties.getProperty("margin", Integer.class, 2);
 | 
			
		||||
		boolean invert = properties.getProperty("invert", Boolean.class, false);
 | 
			
		||||
		int width = environment.getProperty("banner.image.width", Integer.class, 76);
 | 
			
		||||
		int height = environment.getProperty("banner.image.height", Integer.class, 0);
 | 
			
		||||
		int margin = environment.getProperty("banner.image.margin", Integer.class, 2);
 | 
			
		||||
		boolean invert = environment.getProperty("banner.image.invert", Boolean.class,
 | 
			
		||||
				false);
 | 
			
		||||
		BufferedImage image = readImage(width, height);
 | 
			
		||||
		printBanner(image, margin, invert, out);
 | 
			
		||||
	}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -40,8 +40,9 @@ import org.springframework.beans.factory.support.BeanDefinitionRegistry;
 | 
			
		|||
import org.springframework.beans.factory.support.BeanNameGenerator;
 | 
			
		||||
import org.springframework.beans.factory.xml.XmlBeanDefinitionReader;
 | 
			
		||||
import org.springframework.boot.Banner.Mode;
 | 
			
		||||
import org.springframework.boot.bind.PropertiesConfigurationFactory;
 | 
			
		||||
import org.springframework.boot.bind.RelaxedPropertyResolver;
 | 
			
		||||
import org.springframework.boot.context.properties.bind.Bindable;
 | 
			
		||||
import org.springframework.boot.context.properties.bind.Binder;
 | 
			
		||||
import org.springframework.boot.context.properties.source.ConfigurationPropertySources;
 | 
			
		||||
import org.springframework.context.ApplicationContext;
 | 
			
		||||
import org.springframework.context.ApplicationContextInitializer;
 | 
			
		||||
import org.springframework.context.ApplicationListener;
 | 
			
		||||
| 
						 | 
				
			
			@ -54,8 +55,6 @@ import org.springframework.context.support.AbstractApplicationContext;
 | 
			
		|||
import org.springframework.context.support.GenericApplicationContext;
 | 
			
		||||
import org.springframework.core.GenericTypeResolver;
 | 
			
		||||
import org.springframework.core.annotation.AnnotationAwareOrderComparator;
 | 
			
		||||
import org.springframework.core.convert.ConversionService;
 | 
			
		||||
import org.springframework.core.convert.support.DefaultConversionService;
 | 
			
		||||
import org.springframework.core.env.CommandLinePropertySource;
 | 
			
		||||
import org.springframework.core.env.CompositePropertySource;
 | 
			
		||||
import org.springframework.core.env.ConfigurableEnvironment;
 | 
			
		||||
| 
						 | 
				
			
			@ -75,7 +74,6 @@ import org.springframework.util.ObjectUtils;
 | 
			
		|||
import org.springframework.util.ReflectionUtils;
 | 
			
		||||
import org.springframework.util.StopWatch;
 | 
			
		||||
import org.springframework.util.StringUtils;
 | 
			
		||||
import org.springframework.validation.BindException;
 | 
			
		||||
import org.springframework.web.context.WebApplicationContext;
 | 
			
		||||
import org.springframework.web.context.support.StandardServletEnvironment;
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -375,6 +373,7 @@ public class SpringApplication {
 | 
			
		|||
				&& this.webApplicationType == WebApplicationType.NONE) {
 | 
			
		||||
			environment = convertToStandardEnvironment(environment);
 | 
			
		||||
		}
 | 
			
		||||
		ConfigurationPropertySources.attach(environment);
 | 
			
		||||
		return environment;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -576,9 +575,8 @@ public class SpringApplication {
 | 
			
		|||
	private void configureIgnoreBeanInfo(ConfigurableEnvironment environment) {
 | 
			
		||||
		if (System.getProperty(
 | 
			
		||||
				CachedIntrospectionResults.IGNORE_BEANINFO_PROPERTY_NAME) == null) {
 | 
			
		||||
			RelaxedPropertyResolver resolver = new RelaxedPropertyResolver(environment,
 | 
			
		||||
					"spring.beaninfo.");
 | 
			
		||||
			Boolean ignore = resolver.getProperty("ignore", Boolean.class, Boolean.TRUE);
 | 
			
		||||
			Boolean ignore = environment.getProperty("spring.beaninfo.ignore",
 | 
			
		||||
					Boolean.class, Boolean.TRUE);
 | 
			
		||||
			System.setProperty(CachedIntrospectionResults.IGNORE_BEANINFO_PROPERTY_NAME,
 | 
			
		||||
					ignore.toString());
 | 
			
		||||
		}
 | 
			
		||||
| 
						 | 
				
			
			@ -589,16 +587,10 @@ public class SpringApplication {
 | 
			
		|||
	 * @param environment the environment to bind
 | 
			
		||||
	 */
 | 
			
		||||
	protected void bindToSpringApplication(ConfigurableEnvironment environment) {
 | 
			
		||||
		PropertiesConfigurationFactory<SpringApplication> binder = new PropertiesConfigurationFactory<>(
 | 
			
		||||
				this);
 | 
			
		||||
		ConversionService conversionService = new DefaultConversionService();
 | 
			
		||||
		binder.setTargetName("spring.main");
 | 
			
		||||
		binder.setConversionService(conversionService);
 | 
			
		||||
		binder.setPropertySources(environment.getPropertySources());
 | 
			
		||||
		try {
 | 
			
		||||
			binder.bindPropertiesToTarget();
 | 
			
		||||
			Binder.get(environment).bind("spring.main", Bindable.ofInstance(this));
 | 
			
		||||
		}
 | 
			
		||||
		catch (BindException ex) {
 | 
			
		||||
		catch (Exception ex) {
 | 
			
		||||
			throw new IllegalStateException("Cannot bind to SpringApplication", ex);
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,118 +0,0 @@
 | 
			
		|||
/*
 | 
			
		||||
 * Copyright 2012-2017 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.
 | 
			
		||||
 * You may obtain a copy of the License at
 | 
			
		||||
 *
 | 
			
		||||
 *      http://www.apache.org/licenses/LICENSE-2.0
 | 
			
		||||
 *
 | 
			
		||||
 * Unless required by applicable law or agreed to in writing, software
 | 
			
		||||
 * distributed under the License is distributed on an "AS IS" BASIS,
 | 
			
		||||
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | 
			
		||||
 * See the License for the specific language governing permissions and
 | 
			
		||||
 * limitations under the License.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
package org.springframework.boot.bind;
 | 
			
		||||
 | 
			
		||||
import java.util.Arrays;
 | 
			
		||||
import java.util.HashSet;
 | 
			
		||||
import java.util.Set;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * {@link PropertyNamePatternsMatcher} that matches when a property name exactly matches
 | 
			
		||||
 * one of the given names, or starts with one of the given names followed by a delimiter.
 | 
			
		||||
 * This implementation is optimized for frequent calls.
 | 
			
		||||
 *
 | 
			
		||||
 * @author Phillip Webb
 | 
			
		||||
 * @since 1.2.0
 | 
			
		||||
 */
 | 
			
		||||
class DefaultPropertyNamePatternsMatcher implements PropertyNamePatternsMatcher {
 | 
			
		||||
 | 
			
		||||
	private final char[] delimiters;
 | 
			
		||||
 | 
			
		||||
	private final boolean ignoreCase;
 | 
			
		||||
 | 
			
		||||
	private final String[] names;
 | 
			
		||||
 | 
			
		||||
	protected DefaultPropertyNamePatternsMatcher(char[] delimiters, String... names) {
 | 
			
		||||
		this(delimiters, false, names);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	protected DefaultPropertyNamePatternsMatcher(char[] delimiters, boolean ignoreCase,
 | 
			
		||||
			String... names) {
 | 
			
		||||
		this(delimiters, ignoreCase, new HashSet<>(Arrays.asList(names)));
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	DefaultPropertyNamePatternsMatcher(char[] delimiters, boolean ignoreCase,
 | 
			
		||||
			Set<String> names) {
 | 
			
		||||
		this.delimiters = delimiters;
 | 
			
		||||
		this.ignoreCase = ignoreCase;
 | 
			
		||||
		this.names = names.toArray(new String[names.size()]);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	@Override
 | 
			
		||||
	public boolean matches(String propertyName) {
 | 
			
		||||
		char[] propertyNameChars = propertyName.toCharArray();
 | 
			
		||||
		boolean[] match = new boolean[this.names.length];
 | 
			
		||||
		boolean noneMatched = true;
 | 
			
		||||
		for (int i = 0; i < this.names.length; i++) {
 | 
			
		||||
			if (this.names[i].length() <= propertyNameChars.length) {
 | 
			
		||||
				match[i] = true;
 | 
			
		||||
				noneMatched = false;
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
		if (noneMatched) {
 | 
			
		||||
			return false;
 | 
			
		||||
		}
 | 
			
		||||
		for (int charIndex = 0; charIndex < propertyNameChars.length; charIndex++) {
 | 
			
		||||
			for (int nameIndex = 0; nameIndex < this.names.length; nameIndex++) {
 | 
			
		||||
				if (match[nameIndex]) {
 | 
			
		||||
					match[nameIndex] = false;
 | 
			
		||||
					if (charIndex < this.names[nameIndex].length()) {
 | 
			
		||||
						if (isCharMatch(this.names[nameIndex].charAt(charIndex),
 | 
			
		||||
								propertyNameChars[charIndex])) {
 | 
			
		||||
							match[nameIndex] = true;
 | 
			
		||||
							noneMatched = false;
 | 
			
		||||
						}
 | 
			
		||||
					}
 | 
			
		||||
					else {
 | 
			
		||||
						char charAfter = propertyNameChars[this.names[nameIndex]
 | 
			
		||||
								.length()];
 | 
			
		||||
						if (isDelimiter(charAfter)) {
 | 
			
		||||
							match[nameIndex] = true;
 | 
			
		||||
							noneMatched = false;
 | 
			
		||||
						}
 | 
			
		||||
					}
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
			if (noneMatched) {
 | 
			
		||||
				return false;
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
		for (int i = 0; i < match.length; i++) {
 | 
			
		||||
			if (match[i]) {
 | 
			
		||||
				return true;
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
		return false;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	private boolean isCharMatch(char c1, char c2) {
 | 
			
		||||
		if (this.ignoreCase) {
 | 
			
		||||
			return Character.toLowerCase(c1) == Character.toLowerCase(c2);
 | 
			
		||||
		}
 | 
			
		||||
		return c1 == c2;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	private boolean isDelimiter(char c) {
 | 
			
		||||
		for (char delimiter : this.delimiters) {
 | 
			
		||||
			if (c == delimiter) {
 | 
			
		||||
				return true;
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
		return false;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -1,5 +1,5 @@
 | 
			
		|||
/*
 | 
			
		||||
 * Copyright 2012-2015 the original author or authors.
 | 
			
		||||
 * Copyright 2012-2017 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.
 | 
			
		||||
| 
						 | 
				
			
			@ -26,6 +26,7 @@ import java.net.UnknownHostException;
 | 
			
		|||
 *
 | 
			
		||||
 * @author Dave Syer
 | 
			
		||||
 */
 | 
			
		||||
@Deprecated
 | 
			
		||||
public class InetAddressEditor extends PropertyEditorSupport {
 | 
			
		||||
 | 
			
		||||
	@Override
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,5 +1,5 @@
 | 
			
		|||
/*
 | 
			
		||||
 * Copyright 2012-2015 the original author or authors.
 | 
			
		||||
 * Copyright 2012-2017 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.
 | 
			
		||||
| 
						 | 
				
			
			@ -24,6 +24,7 @@ import org.springframework.core.env.PropertySource;
 | 
			
		|||
 *
 | 
			
		||||
 * @author Andy Wilkinson
 | 
			
		||||
 */
 | 
			
		||||
@Deprecated
 | 
			
		||||
class OriginCapablePropertyValue extends PropertyValue {
 | 
			
		||||
 | 
			
		||||
	private static final String ATTRIBUTE_PROPERTY_ORIGIN = "propertyOrigin";
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,5 +1,5 @@
 | 
			
		|||
/*
 | 
			
		||||
 * Copyright 2012-2014 the original author or authors.
 | 
			
		||||
 * Copyright 2012-2017 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.
 | 
			
		||||
| 
						 | 
				
			
			@ -27,6 +27,7 @@ import org.springframework.util.PatternMatchUtils;
 | 
			
		|||
 * @author Phillip Webb
 | 
			
		||||
 * @since 1.2.0
 | 
			
		||||
 */
 | 
			
		||||
@Deprecated
 | 
			
		||||
class PatternPropertyNamePatternsMatcher implements PropertyNamePatternsMatcher {
 | 
			
		||||
 | 
			
		||||
	private final String[] patterns;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,345 +0,0 @@
 | 
			
		|||
/*
 | 
			
		||||
 * Copyright 2012-2017 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.
 | 
			
		||||
 * You may obtain a copy of the License at
 | 
			
		||||
 *
 | 
			
		||||
 *      http://www.apache.org/licenses/LICENSE-2.0
 | 
			
		||||
 *
 | 
			
		||||
 * Unless required by applicable law or agreed to in writing, software
 | 
			
		||||
 * distributed under the License is distributed on an "AS IS" BASIS,
 | 
			
		||||
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | 
			
		||||
 * See the License for the specific language governing permissions and
 | 
			
		||||
 * limitations under the License.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
package org.springframework.boot.bind;
 | 
			
		||||
 | 
			
		||||
import java.beans.PropertyDescriptor;
 | 
			
		||||
import java.util.HashSet;
 | 
			
		||||
import java.util.LinkedHashSet;
 | 
			
		||||
import java.util.Locale;
 | 
			
		||||
import java.util.Map;
 | 
			
		||||
import java.util.Properties;
 | 
			
		||||
import java.util.Set;
 | 
			
		||||
 | 
			
		||||
import org.apache.commons.logging.Log;
 | 
			
		||||
import org.apache.commons.logging.LogFactory;
 | 
			
		||||
 | 
			
		||||
import org.springframework.beans.BeanUtils;
 | 
			
		||||
import org.springframework.beans.PropertyValues;
 | 
			
		||||
import org.springframework.beans.factory.FactoryBean;
 | 
			
		||||
import org.springframework.beans.factory.InitializingBean;
 | 
			
		||||
import org.springframework.context.MessageSource;
 | 
			
		||||
import org.springframework.context.MessageSourceAware;
 | 
			
		||||
import org.springframework.core.convert.ConversionService;
 | 
			
		||||
import org.springframework.core.env.PropertySources;
 | 
			
		||||
import org.springframework.util.Assert;
 | 
			
		||||
import org.springframework.util.StringUtils;
 | 
			
		||||
import org.springframework.validation.BindException;
 | 
			
		||||
import org.springframework.validation.BindingResult;
 | 
			
		||||
import org.springframework.validation.DataBinder;
 | 
			
		||||
import org.springframework.validation.ObjectError;
 | 
			
		||||
import org.springframework.validation.Validator;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Validate some {@link Properties} (or optionally {@link PropertySources}) by binding
 | 
			
		||||
 * them to an object of a specified type and then optionally running a {@link Validator}
 | 
			
		||||
 * over it.
 | 
			
		||||
 *
 | 
			
		||||
 * @param <T> the target type
 | 
			
		||||
 * @author Dave Syer
 | 
			
		||||
 */
 | 
			
		||||
public class PropertiesConfigurationFactory<T>
 | 
			
		||||
		implements FactoryBean<T>, MessageSourceAware, InitializingBean {
 | 
			
		||||
 | 
			
		||||
	private static final char[] EXACT_DELIMITERS = { '_', '.', '[' };
 | 
			
		||||
 | 
			
		||||
	private static final char[] TARGET_NAME_DELIMITERS = { '_', '.' };
 | 
			
		||||
 | 
			
		||||
	private static final Log logger = LogFactory
 | 
			
		||||
			.getLog(PropertiesConfigurationFactory.class);
 | 
			
		||||
 | 
			
		||||
	private boolean ignoreUnknownFields = true;
 | 
			
		||||
 | 
			
		||||
	private boolean ignoreInvalidFields;
 | 
			
		||||
 | 
			
		||||
	private PropertySources propertySources;
 | 
			
		||||
 | 
			
		||||
	private final T target;
 | 
			
		||||
 | 
			
		||||
	private Validator validator;
 | 
			
		||||
 | 
			
		||||
	private MessageSource messageSource;
 | 
			
		||||
 | 
			
		||||
	private boolean hasBeenBound = false;
 | 
			
		||||
 | 
			
		||||
	private boolean ignoreNestedProperties = false;
 | 
			
		||||
 | 
			
		||||
	private String targetName;
 | 
			
		||||
 | 
			
		||||
	private ConversionService conversionService;
 | 
			
		||||
 | 
			
		||||
	private boolean resolvePlaceholders = true;
 | 
			
		||||
 | 
			
		||||
	/**
 | 
			
		||||
	 * Create a new {@link PropertiesConfigurationFactory} instance.
 | 
			
		||||
	 * @param target the target object to bind too
 | 
			
		||||
	 * @see #PropertiesConfigurationFactory(Class)
 | 
			
		||||
	 */
 | 
			
		||||
	public PropertiesConfigurationFactory(T target) {
 | 
			
		||||
		Assert.notNull(target, "Target object must not be null");
 | 
			
		||||
		this.target = target;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	/**
 | 
			
		||||
	 * Create a new {@link PropertiesConfigurationFactory} instance.
 | 
			
		||||
	 * @param type the target type
 | 
			
		||||
	 * @see #PropertiesConfigurationFactory(Class)
 | 
			
		||||
	 */
 | 
			
		||||
	@SuppressWarnings("unchecked")
 | 
			
		||||
	public PropertiesConfigurationFactory(Class<?> type) {
 | 
			
		||||
		Assert.notNull(type, "Target type must not be null");
 | 
			
		||||
		this.target = (T) BeanUtils.instantiateClass(type);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	/**
 | 
			
		||||
	 * Flag to disable binding of nested properties (i.e. those with period separators in
 | 
			
		||||
	 * their paths). Can be useful to disable this if the name prefix is empty and you
 | 
			
		||||
	 * don't want to ignore unknown fields.
 | 
			
		||||
	 * @param ignoreNestedProperties the flag to set (default false)
 | 
			
		||||
	 */
 | 
			
		||||
	public void setIgnoreNestedProperties(boolean ignoreNestedProperties) {
 | 
			
		||||
		this.ignoreNestedProperties = ignoreNestedProperties;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	/**
 | 
			
		||||
	 * Set whether to ignore unknown fields, that is, whether to ignore bind parameters
 | 
			
		||||
	 * that do not have corresponding fields in the target object.
 | 
			
		||||
	 * <p>
 | 
			
		||||
	 * Default is "true". Turn this off to enforce that all bind parameters must have a
 | 
			
		||||
	 * matching field in the target object.
 | 
			
		||||
	 * @param ignoreUnknownFields if unknown fields should be ignored
 | 
			
		||||
	 */
 | 
			
		||||
	public void setIgnoreUnknownFields(boolean ignoreUnknownFields) {
 | 
			
		||||
		this.ignoreUnknownFields = ignoreUnknownFields;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	/**
 | 
			
		||||
	 * Set whether to ignore invalid fields, that is, whether to ignore bind parameters
 | 
			
		||||
	 * that have corresponding fields in the target object which are not accessible (for
 | 
			
		||||
	 * example because of null values in the nested path).
 | 
			
		||||
	 * <p>
 | 
			
		||||
	 * Default is "false". Turn this on to ignore bind parameters for nested objects in
 | 
			
		||||
	 * non-existing parts of the target object graph.
 | 
			
		||||
	 * @param ignoreInvalidFields if invalid fields should be ignored
 | 
			
		||||
	 */
 | 
			
		||||
	public void setIgnoreInvalidFields(boolean ignoreInvalidFields) {
 | 
			
		||||
		this.ignoreInvalidFields = ignoreInvalidFields;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	/**
 | 
			
		||||
	 * Set the target name.
 | 
			
		||||
	 * @param targetName the target name
 | 
			
		||||
	 */
 | 
			
		||||
	public void setTargetName(String targetName) {
 | 
			
		||||
		this.targetName = targetName;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	/**
 | 
			
		||||
	 * Set the message source.
 | 
			
		||||
	 * @param messageSource the message source
 | 
			
		||||
	 */
 | 
			
		||||
	@Override
 | 
			
		||||
	public void setMessageSource(MessageSource messageSource) {
 | 
			
		||||
		this.messageSource = messageSource;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	/**
 | 
			
		||||
	 * Set the property sources.
 | 
			
		||||
	 * @param propertySources the property sources
 | 
			
		||||
	 */
 | 
			
		||||
	public void setPropertySources(PropertySources propertySources) {
 | 
			
		||||
		this.propertySources = propertySources;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	/**
 | 
			
		||||
	 * Set the conversion service.
 | 
			
		||||
	 * @param conversionService the conversion service
 | 
			
		||||
	 */
 | 
			
		||||
	public void setConversionService(ConversionService conversionService) {
 | 
			
		||||
		this.conversionService = conversionService;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	/**
 | 
			
		||||
	 * Set the validator.
 | 
			
		||||
	 * @param validator the validator
 | 
			
		||||
	 */
 | 
			
		||||
	public void setValidator(Validator validator) {
 | 
			
		||||
		this.validator = validator;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	/**
 | 
			
		||||
	 * Flag to indicate that placeholders should be replaced during binding. Default is
 | 
			
		||||
	 * true.
 | 
			
		||||
	 * @param resolvePlaceholders flag value
 | 
			
		||||
	 */
 | 
			
		||||
	public void setResolvePlaceholders(boolean resolvePlaceholders) {
 | 
			
		||||
		this.resolvePlaceholders = resolvePlaceholders;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	@Override
 | 
			
		||||
	public void afterPropertiesSet() throws Exception {
 | 
			
		||||
		bindPropertiesToTarget();
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	@Override
 | 
			
		||||
	public Class<?> getObjectType() {
 | 
			
		||||
		if (this.target == null) {
 | 
			
		||||
			return Object.class;
 | 
			
		||||
		}
 | 
			
		||||
		return this.target.getClass();
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	@Override
 | 
			
		||||
	public boolean isSingleton() {
 | 
			
		||||
		return true;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	@Override
 | 
			
		||||
	public T getObject() throws Exception {
 | 
			
		||||
		if (!this.hasBeenBound) {
 | 
			
		||||
			bindPropertiesToTarget();
 | 
			
		||||
		}
 | 
			
		||||
		return this.target;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	public void bindPropertiesToTarget() throws BindException {
 | 
			
		||||
		Assert.state(this.propertySources != null, "PropertySources should not be null");
 | 
			
		||||
		if (logger.isTraceEnabled()) {
 | 
			
		||||
			logger.trace("Property Sources: " + this.propertySources);
 | 
			
		||||
 | 
			
		||||
		}
 | 
			
		||||
		this.hasBeenBound = true;
 | 
			
		||||
		doBindPropertiesToTarget();
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	private void doBindPropertiesToTarget() throws BindException {
 | 
			
		||||
		RelaxedDataBinder dataBinder = (this.targetName != null
 | 
			
		||||
				? new RelaxedDataBinder(this.target, this.targetName)
 | 
			
		||||
				: new RelaxedDataBinder(this.target));
 | 
			
		||||
		if (this.validator != null
 | 
			
		||||
				&& this.validator.supports(dataBinder.getTarget().getClass())) {
 | 
			
		||||
			dataBinder.setValidator(this.validator);
 | 
			
		||||
		}
 | 
			
		||||
		if (this.conversionService != null) {
 | 
			
		||||
			dataBinder.setConversionService(this.conversionService);
 | 
			
		||||
		}
 | 
			
		||||
		dataBinder.setAutoGrowCollectionLimit(Integer.MAX_VALUE);
 | 
			
		||||
		dataBinder.setIgnoreNestedProperties(this.ignoreNestedProperties);
 | 
			
		||||
		dataBinder.setIgnoreInvalidFields(this.ignoreInvalidFields);
 | 
			
		||||
		dataBinder.setIgnoreUnknownFields(this.ignoreUnknownFields);
 | 
			
		||||
		customizeBinder(dataBinder);
 | 
			
		||||
		Iterable<String> relaxedTargetNames = getRelaxedTargetNames();
 | 
			
		||||
		Set<String> names = getNames(relaxedTargetNames);
 | 
			
		||||
		PropertyValues propertyValues = getPropertySourcesPropertyValues(names,
 | 
			
		||||
				relaxedTargetNames);
 | 
			
		||||
		dataBinder.bind(propertyValues);
 | 
			
		||||
		if (this.validator != null) {
 | 
			
		||||
			dataBinder.validate();
 | 
			
		||||
		}
 | 
			
		||||
		checkForBindingErrors(dataBinder);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	private Iterable<String> getRelaxedTargetNames() {
 | 
			
		||||
		return (this.target != null && StringUtils.hasLength(this.targetName)
 | 
			
		||||
				? new RelaxedNames(this.targetName) : null);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	private Set<String> getNames(Iterable<String> prefixes) {
 | 
			
		||||
		Set<String> names = new LinkedHashSet<>();
 | 
			
		||||
		if (this.target != null) {
 | 
			
		||||
			PropertyDescriptor[] descriptors = BeanUtils
 | 
			
		||||
					.getPropertyDescriptors(this.target.getClass());
 | 
			
		||||
			for (PropertyDescriptor descriptor : descriptors) {
 | 
			
		||||
				String name = descriptor.getName();
 | 
			
		||||
				if (!name.equals("class")) {
 | 
			
		||||
					RelaxedNames relaxedNames = RelaxedNames.forCamelCase(name);
 | 
			
		||||
					if (prefixes == null) {
 | 
			
		||||
						for (String relaxedName : relaxedNames) {
 | 
			
		||||
							names.add(relaxedName);
 | 
			
		||||
						}
 | 
			
		||||
					}
 | 
			
		||||
					else {
 | 
			
		||||
						for (String prefix : prefixes) {
 | 
			
		||||
							for (String relaxedName : relaxedNames) {
 | 
			
		||||
								names.add(prefix + "." + relaxedName);
 | 
			
		||||
								names.add(prefix + "_" + relaxedName);
 | 
			
		||||
							}
 | 
			
		||||
						}
 | 
			
		||||
					}
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
		return names;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	private PropertyValues getPropertySourcesPropertyValues(Set<String> names,
 | 
			
		||||
			Iterable<String> relaxedTargetNames) {
 | 
			
		||||
		PropertyNamePatternsMatcher includes = getPropertyNamePatternsMatcher(names,
 | 
			
		||||
				relaxedTargetNames);
 | 
			
		||||
		return new PropertySourcesPropertyValues(this.propertySources, names, includes,
 | 
			
		||||
				this.resolvePlaceholders);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	private PropertyNamePatternsMatcher getPropertyNamePatternsMatcher(Set<String> names,
 | 
			
		||||
			Iterable<String> relaxedTargetNames) {
 | 
			
		||||
		if (this.ignoreUnknownFields && !isMapTarget()) {
 | 
			
		||||
			// Since unknown fields are ignored we can filter them out early to save
 | 
			
		||||
			// unnecessary calls to the PropertySource.
 | 
			
		||||
			return new DefaultPropertyNamePatternsMatcher(EXACT_DELIMITERS, true, names);
 | 
			
		||||
		}
 | 
			
		||||
		if (relaxedTargetNames != null) {
 | 
			
		||||
			// We can filter properties to those starting with the target name, but
 | 
			
		||||
			// we can't do a complete filter since we need to trigger the
 | 
			
		||||
			// unknown fields check
 | 
			
		||||
			Set<String> relaxedNames = new HashSet<>();
 | 
			
		||||
			for (String relaxedTargetName : relaxedTargetNames) {
 | 
			
		||||
				relaxedNames.add(relaxedTargetName);
 | 
			
		||||
			}
 | 
			
		||||
			return new DefaultPropertyNamePatternsMatcher(TARGET_NAME_DELIMITERS, true,
 | 
			
		||||
					relaxedNames);
 | 
			
		||||
		}
 | 
			
		||||
		// Not ideal, we basically can't filter anything
 | 
			
		||||
		return PropertyNamePatternsMatcher.ALL;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	private boolean isMapTarget() {
 | 
			
		||||
		return this.target != null && Map.class.isAssignableFrom(this.target.getClass());
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	private void checkForBindingErrors(RelaxedDataBinder dataBinder)
 | 
			
		||||
			throws BindException {
 | 
			
		||||
		BindingResult errors = dataBinder.getBindingResult();
 | 
			
		||||
		if (errors.hasErrors()) {
 | 
			
		||||
			logger.error("Properties configuration failed validation");
 | 
			
		||||
			for (ObjectError error : errors.getAllErrors()) {
 | 
			
		||||
				logger.error(
 | 
			
		||||
						this.messageSource != null
 | 
			
		||||
								? this.messageSource.getMessage(error,
 | 
			
		||||
										Locale.getDefault()) + " (" + error + ")"
 | 
			
		||||
								: error);
 | 
			
		||||
			}
 | 
			
		||||
			throw new BindException(errors);
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	/**
 | 
			
		||||
	 * Customize the data binder.
 | 
			
		||||
	 * @param dataBinder the data binder that will be used to bind and validate
 | 
			
		||||
	 */
 | 
			
		||||
	protected void customizeBinder(DataBinder dataBinder) {
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -22,6 +22,7 @@ package org.springframework.boot.bind;
 | 
			
		|||
 * @author Phillip Webb
 | 
			
		||||
 * @since 1.2.0
 | 
			
		||||
 */
 | 
			
		||||
@Deprecated
 | 
			
		||||
interface PropertyNamePatternsMatcher {
 | 
			
		||||
 | 
			
		||||
	PropertyNamePatternsMatcher ALL = new PropertyNamePatternsMatcher() {
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,5 +1,5 @@
 | 
			
		|||
/*
 | 
			
		||||
 * Copyright 2012-2015 the original author or authors.
 | 
			
		||||
 * Copyright 2012-2017 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.
 | 
			
		||||
| 
						 | 
				
			
			@ -25,6 +25,7 @@ import org.springframework.core.env.PropertySource;
 | 
			
		|||
 * @author Andy Wilkinson
 | 
			
		||||
 * @since 1.3.0
 | 
			
		||||
 */
 | 
			
		||||
@Deprecated
 | 
			
		||||
public class PropertyOrigin {
 | 
			
		||||
 | 
			
		||||
	private final PropertySource<?> source;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,91 +0,0 @@
 | 
			
		|||
/*
 | 
			
		||||
 * Copyright 2012-2017 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.
 | 
			
		||||
 * You may obtain a copy of the License at
 | 
			
		||||
 *
 | 
			
		||||
 *      http://www.apache.org/licenses/LICENSE-2.0
 | 
			
		||||
 *
 | 
			
		||||
 * Unless required by applicable law or agreed to in writing, software
 | 
			
		||||
 * distributed under the License is distributed on an "AS IS" BASIS,
 | 
			
		||||
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | 
			
		||||
 * See the License for the specific language governing permissions and
 | 
			
		||||
 * limitations under the License.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
package org.springframework.boot.bind;
 | 
			
		||||
 | 
			
		||||
import java.util.Collections;
 | 
			
		||||
import java.util.LinkedHashMap;
 | 
			
		||||
import java.util.Map;
 | 
			
		||||
 | 
			
		||||
import org.springframework.core.env.EnumerablePropertySource;
 | 
			
		||||
import org.springframework.core.env.PropertySource;
 | 
			
		||||
import org.springframework.core.env.PropertySources;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Convenience class for manipulating PropertySources.
 | 
			
		||||
 *
 | 
			
		||||
 * @author Dave Syer
 | 
			
		||||
 * @see PropertySource
 | 
			
		||||
 * @see PropertySources
 | 
			
		||||
 */
 | 
			
		||||
public abstract class PropertySourceUtils {
 | 
			
		||||
 | 
			
		||||
	/**
 | 
			
		||||
	 * Return a Map of all values from the specified {@link PropertySources} that start
 | 
			
		||||
	 * with a particular key.
 | 
			
		||||
	 * @param propertySources the property sources to scan
 | 
			
		||||
	 * @param keyPrefix the key prefixes to test
 | 
			
		||||
	 * @return a map of all sub properties starting with the specified key prefixes.
 | 
			
		||||
	 * @see PropertySourceUtils#getSubProperties(PropertySources, String, String)
 | 
			
		||||
	 */
 | 
			
		||||
	public static Map<String, Object> getSubProperties(PropertySources propertySources,
 | 
			
		||||
			String keyPrefix) {
 | 
			
		||||
		return PropertySourceUtils.getSubProperties(propertySources, null, keyPrefix);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	/**
 | 
			
		||||
	 * Return a Map of all values from the specified {@link PropertySources} that start
 | 
			
		||||
	 * with a particular key.
 | 
			
		||||
	 * @param propertySources the property sources to scan
 | 
			
		||||
	 * @param rootPrefix a root prefix to be prepended to the keyPrefix (can be
 | 
			
		||||
	 * {@code null})
 | 
			
		||||
	 * @param keyPrefix the key prefixes to test
 | 
			
		||||
	 * @return a map of all sub properties starting with the specified key prefixes.
 | 
			
		||||
	 * @see #getSubProperties(PropertySources, String, String)
 | 
			
		||||
	 */
 | 
			
		||||
	public static Map<String, Object> getSubProperties(PropertySources propertySources,
 | 
			
		||||
			String rootPrefix, String keyPrefix) {
 | 
			
		||||
		RelaxedNames keyPrefixes = new RelaxedNames(keyPrefix);
 | 
			
		||||
		Map<String, Object> subProperties = new LinkedHashMap<>();
 | 
			
		||||
		for (PropertySource<?> source : propertySources) {
 | 
			
		||||
			if (source instanceof EnumerablePropertySource) {
 | 
			
		||||
				for (String name : ((EnumerablePropertySource<?>) source)
 | 
			
		||||
						.getPropertyNames()) {
 | 
			
		||||
					String key = PropertySourceUtils.getSubKey(name, rootPrefix,
 | 
			
		||||
							keyPrefixes);
 | 
			
		||||
					if (key != null && !subProperties.containsKey(key)) {
 | 
			
		||||
						subProperties.put(key, source.getProperty(name));
 | 
			
		||||
					}
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
		return Collections.unmodifiableMap(subProperties);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	private static String getSubKey(String name, String rootPrefixes,
 | 
			
		||||
			RelaxedNames keyPrefix) {
 | 
			
		||||
		rootPrefixes = (rootPrefixes == null ? "" : rootPrefixes);
 | 
			
		||||
		for (String rootPrefix : new RelaxedNames(rootPrefixes)) {
 | 
			
		||||
			for (String candidateKeyPrefix : keyPrefix) {
 | 
			
		||||
				if (name.startsWith(rootPrefix + candidateKeyPrefix)) {
 | 
			
		||||
					return name.substring((rootPrefix + candidateKeyPrefix).length());
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
		return null;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -1,128 +0,0 @@
 | 
			
		|||
/*
 | 
			
		||||
 * Copyright 2012-2017 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.
 | 
			
		||||
 * You may obtain a copy of the License at
 | 
			
		||||
 *
 | 
			
		||||
 *      http://www.apache.org/licenses/LICENSE-2.0
 | 
			
		||||
 *
 | 
			
		||||
 * Unless required by applicable law or agreed to in writing, software
 | 
			
		||||
 * distributed under the License is distributed on an "AS IS" BASIS,
 | 
			
		||||
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | 
			
		||||
 * See the License for the specific language governing permissions and
 | 
			
		||||
 * limitations under the License.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
package org.springframework.boot.bind;
 | 
			
		||||
 | 
			
		||||
import java.util.LinkedHashMap;
 | 
			
		||||
import java.util.Map;
 | 
			
		||||
 | 
			
		||||
import org.springframework.core.convert.ConversionService;
 | 
			
		||||
import org.springframework.core.env.ConfigurableEnvironment;
 | 
			
		||||
import org.springframework.core.env.Environment;
 | 
			
		||||
import org.springframework.core.env.MutablePropertySources;
 | 
			
		||||
import org.springframework.core.env.PropertySource;
 | 
			
		||||
import org.springframework.core.env.PropertySources;
 | 
			
		||||
import org.springframework.util.StringUtils;
 | 
			
		||||
import org.springframework.validation.BindException;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Helper extracting info from {@link PropertySources}.
 | 
			
		||||
 *
 | 
			
		||||
 * @author Stephane Nicoll
 | 
			
		||||
 * @since 1.4.0
 | 
			
		||||
 */
 | 
			
		||||
public class PropertySourcesBinder {
 | 
			
		||||
 | 
			
		||||
	private PropertySources propertySources;
 | 
			
		||||
 | 
			
		||||
	private ConversionService conversionService;
 | 
			
		||||
 | 
			
		||||
	/**
 | 
			
		||||
	 * Create a new instance.
 | 
			
		||||
	 * @param propertySources the {@link PropertySources} to use
 | 
			
		||||
	 */
 | 
			
		||||
	public PropertySourcesBinder(PropertySources propertySources) {
 | 
			
		||||
		this.propertySources = propertySources;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	/**
 | 
			
		||||
	 * Create a new instance from a single {@link PropertySource}.
 | 
			
		||||
	 * @param propertySource the {@link PropertySource} to use
 | 
			
		||||
	 */
 | 
			
		||||
	public PropertySourcesBinder(PropertySource<?> propertySource) {
 | 
			
		||||
		this(createPropertySources(propertySource));
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	/**
 | 
			
		||||
	 * Create a new instance using the {@link Environment} as the property sources.
 | 
			
		||||
	 * @param environment the environment
 | 
			
		||||
	 */
 | 
			
		||||
	public PropertySourcesBinder(ConfigurableEnvironment environment) {
 | 
			
		||||
		this(environment.getPropertySources());
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	public void setPropertySources(PropertySources propertySources) {
 | 
			
		||||
		this.propertySources = propertySources;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	public PropertySources getPropertySources() {
 | 
			
		||||
		return this.propertySources;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	public void setConversionService(ConversionService conversionService) {
 | 
			
		||||
		this.conversionService = conversionService;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	public ConversionService getConversionService() {
 | 
			
		||||
		return this.conversionService;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	/**
 | 
			
		||||
	 * Extract the keys using the specified {@code prefix}. The prefix won't be included.
 | 
			
		||||
	 * <p>
 | 
			
		||||
	 * Any key that starts with the {@code prefix} will be included.
 | 
			
		||||
	 * @param prefix the prefix to use
 | 
			
		||||
	 * @return the keys matching the prefix
 | 
			
		||||
	 */
 | 
			
		||||
	public Map<String, Object> extractAll(String prefix) {
 | 
			
		||||
		Map<String, Object> content = new LinkedHashMap<>();
 | 
			
		||||
		bindTo(prefix, content);
 | 
			
		||||
		return content;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	/**
 | 
			
		||||
	 * Bind the specified {@code target} from the environment using the {@code prefix}.
 | 
			
		||||
	 * <p>
 | 
			
		||||
	 * Any key that starts with the {@code prefix} will be bound to the {@code target}.
 | 
			
		||||
	 * @param prefix the prefix to use
 | 
			
		||||
	 * @param target the object to bind to
 | 
			
		||||
	 */
 | 
			
		||||
	public void bindTo(String prefix, Object target) {
 | 
			
		||||
		PropertiesConfigurationFactory<Object> factory = new PropertiesConfigurationFactory<>(
 | 
			
		||||
				target);
 | 
			
		||||
		if (StringUtils.hasText(prefix)) {
 | 
			
		||||
			factory.setTargetName(prefix);
 | 
			
		||||
		}
 | 
			
		||||
		if (this.conversionService != null) {
 | 
			
		||||
			factory.setConversionService(this.conversionService);
 | 
			
		||||
		}
 | 
			
		||||
		factory.setPropertySources(this.propertySources);
 | 
			
		||||
		try {
 | 
			
		||||
			factory.bindPropertiesToTarget();
 | 
			
		||||
		}
 | 
			
		||||
		catch (BindException ex) {
 | 
			
		||||
			throw new IllegalStateException("Cannot bind to " + target, ex);
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	private static PropertySources createPropertySources(
 | 
			
		||||
			PropertySource<?> propertySource) {
 | 
			
		||||
		MutablePropertySources propertySources = new MutablePropertySources();
 | 
			
		||||
		propertySources.addLast(propertySource);
 | 
			
		||||
		return propertySources;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -25,8 +25,10 @@ import java.util.regex.Pattern;
 | 
			
		|||
import org.springframework.beans.MutablePropertyValues;
 | 
			
		||||
import org.springframework.beans.PropertyValue;
 | 
			
		||||
import org.springframework.beans.PropertyValues;
 | 
			
		||||
import org.springframework.boot.context.properties.source.ConfigurationPropertySources;
 | 
			
		||||
import org.springframework.core.env.CompositePropertySource;
 | 
			
		||||
import org.springframework.core.env.EnumerablePropertySource;
 | 
			
		||||
import org.springframework.core.env.MutablePropertySources;
 | 
			
		||||
import org.springframework.core.env.PropertySource;
 | 
			
		||||
import org.springframework.core.env.PropertySources;
 | 
			
		||||
import org.springframework.core.env.PropertySourcesPropertyResolver;
 | 
			
		||||
| 
						 | 
				
			
			@ -41,6 +43,7 @@ import org.springframework.validation.DataBinder;
 | 
			
		|||
 * @author Dave Syer
 | 
			
		||||
 * @author Phillip Webb
 | 
			
		||||
 */
 | 
			
		||||
@Deprecated
 | 
			
		||||
public class PropertySourcesPropertyValues implements PropertyValues {
 | 
			
		||||
 | 
			
		||||
	private static final Pattern COLLECTION_PROPERTY = Pattern
 | 
			
		||||
| 
						 | 
				
			
			@ -107,6 +110,10 @@ public class PropertySourcesPropertyValues implements PropertyValues {
 | 
			
		|||
			PropertyNamePatternsMatcher includes, boolean resolvePlaceholders) {
 | 
			
		||||
		Assert.notNull(propertySources, "PropertySources must not be null");
 | 
			
		||||
		Assert.notNull(includes, "Includes must not be null");
 | 
			
		||||
		MutablePropertySources mutablePropertySources = new MutablePropertySources(
 | 
			
		||||
				propertySources);
 | 
			
		||||
		mutablePropertySources.remove(ConfigurationPropertySources.PROPERTY_SOURCE_NAME);
 | 
			
		||||
		propertySources = mutablePropertySources;
 | 
			
		||||
		this.propertySources = propertySources;
 | 
			
		||||
		this.nonEnumerableFallbackNames = nonEnumerableFallbackNames;
 | 
			
		||||
		this.includes = includes;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,5 +1,5 @@
 | 
			
		|||
/*
 | 
			
		||||
 * Copyright 2012-2015 the original author or authors.
 | 
			
		||||
 * Copyright 2012-2017 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.
 | 
			
		||||
| 
						 | 
				
			
			@ -26,6 +26,7 @@ import org.springframework.beans.NotWritablePropertyException;
 | 
			
		|||
 * @since 1.3.0
 | 
			
		||||
 * @see RelaxedDataBinder
 | 
			
		||||
 */
 | 
			
		||||
@Deprecated
 | 
			
		||||
public class RelaxedBindingNotWritablePropertyException
 | 
			
		||||
		extends NotWritablePropertyException {
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -36,6 +36,7 @@ import org.springframework.util.Assert;
 | 
			
		|||
 * @author Stephane Nicoll
 | 
			
		||||
 * @since 1.1.0
 | 
			
		||||
 */
 | 
			
		||||
@Deprecated
 | 
			
		||||
class RelaxedConversionService implements ConversionService {
 | 
			
		||||
 | 
			
		||||
	private final ConversionService conversionService;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -56,6 +56,7 @@ import org.springframework.validation.DataBinder;
 | 
			
		|||
 * @author Andy Wilkinson
 | 
			
		||||
 * @see RelaxedNames
 | 
			
		||||
 */
 | 
			
		||||
@Deprecated
 | 
			
		||||
public class RelaxedDataBinder extends DataBinder {
 | 
			
		||||
 | 
			
		||||
	private static final Object BLANK = new Object();
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -30,8 +30,8 @@ import org.springframework.util.StringUtils;
 | 
			
		|||
 * @author Phillip Webb
 | 
			
		||||
 * @author Dave Syer
 | 
			
		||||
 * @see RelaxedDataBinder
 | 
			
		||||
 * @see RelaxedPropertyResolver
 | 
			
		||||
 */
 | 
			
		||||
@Deprecated
 | 
			
		||||
public final class RelaxedNames implements Iterable<String> {
 | 
			
		||||
 | 
			
		||||
	private static final Pattern CAMEL_CASE_PATTERN = Pattern.compile("([^A-Z-])([A-Z])");
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,155 +0,0 @@
 | 
			
		|||
/*
 | 
			
		||||
 * Copyright 2012-2016 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.
 | 
			
		||||
 * You may obtain a copy of the License at
 | 
			
		||||
 *
 | 
			
		||||
 *      http://www.apache.org/licenses/LICENSE-2.0
 | 
			
		||||
 *
 | 
			
		||||
 * Unless required by applicable law or agreed to in writing, software
 | 
			
		||||
 * distributed under the License is distributed on an "AS IS" BASIS,
 | 
			
		||||
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | 
			
		||||
 * See the License for the specific language governing permissions and
 | 
			
		||||
 * limitations under the License.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
package org.springframework.boot.bind;
 | 
			
		||||
 | 
			
		||||
import java.util.Map;
 | 
			
		||||
 | 
			
		||||
import org.springframework.core.env.ConfigurableEnvironment;
 | 
			
		||||
import org.springframework.core.env.Environment;
 | 
			
		||||
import org.springframework.core.env.PropertyResolver;
 | 
			
		||||
import org.springframework.core.env.PropertySourcesPropertyResolver;
 | 
			
		||||
import org.springframework.util.Assert;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * {@link PropertyResolver} that attempts to resolve values using {@link RelaxedNames}.
 | 
			
		||||
 *
 | 
			
		||||
 * @author Phillip Webb
 | 
			
		||||
 * @see RelaxedNames
 | 
			
		||||
 */
 | 
			
		||||
public class RelaxedPropertyResolver implements PropertyResolver {
 | 
			
		||||
 | 
			
		||||
	private final PropertyResolver resolver;
 | 
			
		||||
 | 
			
		||||
	private final String prefix;
 | 
			
		||||
 | 
			
		||||
	public RelaxedPropertyResolver(PropertyResolver resolver) {
 | 
			
		||||
		this(resolver, null);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	public RelaxedPropertyResolver(PropertyResolver resolver, String prefix) {
 | 
			
		||||
		Assert.notNull(resolver, "PropertyResolver must not be null");
 | 
			
		||||
		this.resolver = resolver;
 | 
			
		||||
		this.prefix = (prefix == null ? "" : prefix);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	@Override
 | 
			
		||||
	public String getRequiredProperty(String key) throws IllegalStateException {
 | 
			
		||||
		return getRequiredProperty(key, String.class);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	@Override
 | 
			
		||||
	public <T> T getRequiredProperty(String key, Class<T> targetType)
 | 
			
		||||
			throws IllegalStateException {
 | 
			
		||||
		T value = getProperty(key, targetType);
 | 
			
		||||
		Assert.state(value != null, String.format("required key [%s] not found", key));
 | 
			
		||||
		return value;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	@Override
 | 
			
		||||
	public String getProperty(String key) {
 | 
			
		||||
		return getProperty(key, String.class, null);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	@Override
 | 
			
		||||
	public String getProperty(String key, String defaultValue) {
 | 
			
		||||
		return getProperty(key, String.class, defaultValue);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	@Override
 | 
			
		||||
	public <T> T getProperty(String key, Class<T> targetType) {
 | 
			
		||||
		return getProperty(key, targetType, null);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	@Override
 | 
			
		||||
	public <T> T getProperty(String key, Class<T> targetType, T defaultValue) {
 | 
			
		||||
		RelaxedNames prefixes = new RelaxedNames(this.prefix);
 | 
			
		||||
		RelaxedNames keys = new RelaxedNames(key);
 | 
			
		||||
		for (String prefix : prefixes) {
 | 
			
		||||
			for (String relaxedKey : keys) {
 | 
			
		||||
				if (this.resolver.containsProperty(prefix + relaxedKey)) {
 | 
			
		||||
					return this.resolver.getProperty(prefix + relaxedKey, targetType);
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
		return defaultValue;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	@Override
 | 
			
		||||
	public boolean containsProperty(String key) {
 | 
			
		||||
		RelaxedNames prefixes = new RelaxedNames(this.prefix);
 | 
			
		||||
		RelaxedNames keys = new RelaxedNames(key);
 | 
			
		||||
		for (String prefix : prefixes) {
 | 
			
		||||
			for (String relaxedKey : keys) {
 | 
			
		||||
				if (this.resolver.containsProperty(prefix + relaxedKey)) {
 | 
			
		||||
					return true;
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
		return false;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	@Override
 | 
			
		||||
	public String resolvePlaceholders(String text) {
 | 
			
		||||
		throw new UnsupportedOperationException(
 | 
			
		||||
				"Unable to resolve placeholders with relaxed properties");
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	@Override
 | 
			
		||||
	public String resolveRequiredPlaceholders(String text)
 | 
			
		||||
			throws IllegalArgumentException {
 | 
			
		||||
		throw new UnsupportedOperationException(
 | 
			
		||||
				"Unable to resolve placeholders with relaxed properties");
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	/**
 | 
			
		||||
	 * Return a Map of all values from all underlying properties that start with the
 | 
			
		||||
	 * specified key. NOTE: this method can only be used if the underlying resolver is a
 | 
			
		||||
	 * {@link ConfigurableEnvironment}.
 | 
			
		||||
	 * @param keyPrefix the key prefix used to filter results
 | 
			
		||||
	 * @return a map of all sub properties starting with the specified key prefix.
 | 
			
		||||
	 * @see PropertySourceUtils#getSubProperties
 | 
			
		||||
	 */
 | 
			
		||||
	public Map<String, Object> getSubProperties(String keyPrefix) {
 | 
			
		||||
		Assert.isInstanceOf(ConfigurableEnvironment.class, this.resolver,
 | 
			
		||||
				"SubProperties not available.");
 | 
			
		||||
		ConfigurableEnvironment env = (ConfigurableEnvironment) this.resolver;
 | 
			
		||||
		return PropertySourceUtils.getSubProperties(env.getPropertySources(), this.prefix,
 | 
			
		||||
				keyPrefix);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	/**
 | 
			
		||||
	 * Return a property resolver for the environment, preferring one that ignores
 | 
			
		||||
	 * unresolvable nested placeholders.
 | 
			
		||||
	 * @param environment the source environment
 | 
			
		||||
	 * @param prefix the prefix
 | 
			
		||||
	 * @return a property resolver for the environment
 | 
			
		||||
	 * @since 1.4.3
 | 
			
		||||
	 */
 | 
			
		||||
	public static RelaxedPropertyResolver ignoringUnresolvableNestedPlaceholders(
 | 
			
		||||
			Environment environment, String prefix) {
 | 
			
		||||
		Assert.notNull(environment, "Environment must not be null");
 | 
			
		||||
		PropertyResolver resolver = environment;
 | 
			
		||||
		if (environment instanceof ConfigurableEnvironment) {
 | 
			
		||||
			resolver = new PropertySourcesPropertyResolver(
 | 
			
		||||
					((ConfigurableEnvironment) environment).getPropertySources());
 | 
			
		||||
			((PropertySourcesPropertyResolver) resolver)
 | 
			
		||||
					.setIgnoreUnresolvableNestedPlaceholders(true);
 | 
			
		||||
		}
 | 
			
		||||
		return new RelaxedPropertyResolver(resolver, prefix);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -1,5 +1,5 @@
 | 
			
		|||
/*
 | 
			
		||||
 * Copyright 2012-2014 the original author or authors.
 | 
			
		||||
 * Copyright 2012-2017 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.
 | 
			
		||||
| 
						 | 
				
			
			@ -23,6 +23,7 @@ import org.springframework.core.convert.converter.Converter;
 | 
			
		|||
 *
 | 
			
		||||
 * @author Phillip Webb
 | 
			
		||||
 */
 | 
			
		||||
@Deprecated
 | 
			
		||||
class StringToCharArrayConverter implements Converter<String, char[]> {
 | 
			
		||||
 | 
			
		||||
	@Override
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -48,6 +48,7 @@ import org.springframework.validation.Validator;
 | 
			
		|||
 * @author Luke Taylor
 | 
			
		||||
 * @author Dave Syer
 | 
			
		||||
 */
 | 
			
		||||
@Deprecated
 | 
			
		||||
public class YamlConfigurationFactory<T>
 | 
			
		||||
		implements FactoryBean<T>, MessageSourceAware, InitializingBean {
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -31,6 +31,7 @@ import org.yaml.snakeyaml.nodes.NodeId;
 | 
			
		|||
 *
 | 
			
		||||
 * @author Luke Taylor
 | 
			
		||||
 */
 | 
			
		||||
@Deprecated
 | 
			
		||||
public class YamlJavaBeanPropertyConstructor extends Constructor {
 | 
			
		||||
 | 
			
		||||
	private final Map<Class<?>, Map<String, Property>> properties = new HashMap<>();
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,5 +1,5 @@
 | 
			
		|||
/*
 | 
			
		||||
 * Copyright 2012-2016 the original author or authors.
 | 
			
		||||
 * Copyright 2012-2017 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.
 | 
			
		||||
| 
						 | 
				
			
			@ -19,10 +19,10 @@ package org.springframework.boot.context;
 | 
			
		|||
import org.apache.commons.logging.Log;
 | 
			
		||||
import org.apache.commons.logging.LogFactory;
 | 
			
		||||
 | 
			
		||||
import org.springframework.boot.bind.RelaxedPropertyResolver;
 | 
			
		||||
import org.springframework.boot.context.event.ApplicationEnvironmentPreparedEvent;
 | 
			
		||||
import org.springframework.context.ApplicationListener;
 | 
			
		||||
import org.springframework.core.Ordered;
 | 
			
		||||
import org.springframework.core.env.ConfigurableEnvironment;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * An {@link ApplicationListener} that halts application startup if the system file
 | 
			
		||||
| 
						 | 
				
			
			@ -42,6 +42,7 @@ import org.springframework.core.Ordered;
 | 
			
		|||
 * character-encoding value (e.g. "en_GB.UTF-8").
 | 
			
		||||
 *
 | 
			
		||||
 * @author Dave Syer
 | 
			
		||||
 * @author Madhura Bhave
 | 
			
		||||
 */
 | 
			
		||||
public class FileEncodingApplicationListener
 | 
			
		||||
		implements ApplicationListener<ApplicationEnvironmentPreparedEvent>, Ordered {
 | 
			
		||||
| 
						 | 
				
			
			@ -56,26 +57,25 @@ public class FileEncodingApplicationListener
 | 
			
		|||
 | 
			
		||||
	@Override
 | 
			
		||||
	public void onApplicationEvent(ApplicationEnvironmentPreparedEvent event) {
 | 
			
		||||
		RelaxedPropertyResolver resolver = new RelaxedPropertyResolver(
 | 
			
		||||
				event.getEnvironment(), "spring.");
 | 
			
		||||
		if (resolver.containsProperty("mandatoryFileEncoding")) {
 | 
			
		||||
			String encoding = System.getProperty("file.encoding");
 | 
			
		||||
			String desired = resolver.getProperty("mandatoryFileEncoding");
 | 
			
		||||
			if (encoding != null && !desired.equalsIgnoreCase(encoding)) {
 | 
			
		||||
				logger.error("System property 'file.encoding' is currently '" + encoding
 | 
			
		||||
						+ "'. It should be '" + desired
 | 
			
		||||
						+ "' (as defined in 'spring.mandatoryFileEncoding').");
 | 
			
		||||
				logger.error("Environment variable LANG is '" + System.getenv("LANG")
 | 
			
		||||
						+ "'. You could use a locale setting that matches encoding='"
 | 
			
		||||
						+ desired + "'.");
 | 
			
		||||
				logger.error("Environment variable LC_ALL is '" + System.getenv("LC_ALL")
 | 
			
		||||
						+ "'. You could use a locale setting that matches encoding='"
 | 
			
		||||
						+ desired + "'.");
 | 
			
		||||
				throw new IllegalStateException(
 | 
			
		||||
						"The Java Virtual Machine has not been configured to use the "
 | 
			
		||||
								+ "desired default character encoding (" + desired
 | 
			
		||||
								+ ").");
 | 
			
		||||
			}
 | 
			
		||||
		ConfigurableEnvironment environment = event.getEnvironment();
 | 
			
		||||
		if (!environment.containsProperty("spring.mandatory-file-encoding")) {
 | 
			
		||||
			return;
 | 
			
		||||
		}
 | 
			
		||||
		String encoding = System.getProperty("file.encoding");
 | 
			
		||||
		String desired = environment.getProperty("spring.mandatory-file-encoding");
 | 
			
		||||
		if (encoding != null && !desired.equalsIgnoreCase(encoding)) {
 | 
			
		||||
			logger.error("System property 'file.encoding' is currently '" + encoding
 | 
			
		||||
					+ "'. It should be '" + desired
 | 
			
		||||
					+ "' (as defined in 'spring.mandatoryFileEncoding').");
 | 
			
		||||
			logger.error("Environment variable LANG is '" + System.getenv("LANG")
 | 
			
		||||
					+ "'. You could use a locale setting that matches encoding='"
 | 
			
		||||
					+ desired + "'.");
 | 
			
		||||
			logger.error("Environment variable LC_ALL is '" + System.getenv("LC_ALL")
 | 
			
		||||
					+ "'. You could use a locale setting that matches encoding='"
 | 
			
		||||
					+ desired + "'.");
 | 
			
		||||
			throw new IllegalStateException(
 | 
			
		||||
					"The Java Virtual Machine has not been configured to use the "
 | 
			
		||||
							+ "desired default character encoding (" + desired + ").");
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,5 +1,5 @@
 | 
			
		|||
/*
 | 
			
		||||
 * Copyright 2012-2015 the original author or authors.
 | 
			
		||||
 * Copyright 2012-2017 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.
 | 
			
		||||
| 
						 | 
				
			
			@ -18,10 +18,11 @@ package org.springframework.boot.context.config;
 | 
			
		|||
 | 
			
		||||
import org.springframework.boot.ansi.AnsiOutput;
 | 
			
		||||
import org.springframework.boot.ansi.AnsiOutput.Enabled;
 | 
			
		||||
import org.springframework.boot.bind.RelaxedPropertyResolver;
 | 
			
		||||
import org.springframework.boot.context.event.ApplicationEnvironmentPreparedEvent;
 | 
			
		||||
import org.springframework.boot.context.properties.bind.Binder;
 | 
			
		||||
import org.springframework.context.ApplicationListener;
 | 
			
		||||
import org.springframework.core.Ordered;
 | 
			
		||||
import org.springframework.core.env.ConfigurableEnvironment;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * An {@link ApplicationListener} that configures {@link AnsiOutput} depending on the
 | 
			
		||||
| 
						 | 
				
			
			@ -29,6 +30,7 @@ import org.springframework.core.Ordered;
 | 
			
		|||
 * values.
 | 
			
		||||
 *
 | 
			
		||||
 * @author Raphael von der Grün
 | 
			
		||||
 * @author Madhura Bhave
 | 
			
		||||
 * @since 1.2.0
 | 
			
		||||
 */
 | 
			
		||||
public class AnsiOutputApplicationListener
 | 
			
		||||
| 
						 | 
				
			
			@ -36,23 +38,17 @@ public class AnsiOutputApplicationListener
 | 
			
		|||
 | 
			
		||||
	@Override
 | 
			
		||||
	public void onApplicationEvent(ApplicationEnvironmentPreparedEvent event) {
 | 
			
		||||
		RelaxedPropertyResolver resolver = new RelaxedPropertyResolver(
 | 
			
		||||
				event.getEnvironment(), "spring.output.ansi.");
 | 
			
		||||
		if (resolver.containsProperty("enabled")) {
 | 
			
		||||
			String enabled = resolver.getProperty("enabled");
 | 
			
		||||
			AnsiOutput.setEnabled(Enum.valueOf(Enabled.class, enabled.toUpperCase()));
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		if (resolver.containsProperty("console-available")) {
 | 
			
		||||
			AnsiOutput.setConsoleAvailable(
 | 
			
		||||
					resolver.getProperty("console-available", Boolean.class));
 | 
			
		||||
		}
 | 
			
		||||
		ConfigurableEnvironment environment = event.getEnvironment();
 | 
			
		||||
		Binder.get(environment)
 | 
			
		||||
				.bind("spring.output.ansi.enabled", AnsiOutput.Enabled.class)
 | 
			
		||||
				.ifBound(AnsiOutput::setEnabled);
 | 
			
		||||
		AnsiOutput.setConsoleAvailable(environment
 | 
			
		||||
				.getProperty("spring.output.ansi.console-available", Boolean.class));
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	@Override
 | 
			
		||||
	public int getOrder() {
 | 
			
		||||
		// Apply after ConfigFileApplicationListener has called all
 | 
			
		||||
		// EnvironmentPostProcessors
 | 
			
		||||
		// Apply after ConfigFileApplicationListener has called EnvironmentPostProcessors
 | 
			
		||||
		return ConfigFileApplicationListener.DEFAULT_ORDER + 1;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -34,10 +34,11 @@ import org.springframework.beans.BeansException;
 | 
			
		|||
import org.springframework.beans.factory.config.BeanFactoryPostProcessor;
 | 
			
		||||
import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;
 | 
			
		||||
import org.springframework.boot.SpringApplication;
 | 
			
		||||
import org.springframework.boot.bind.PropertySourcesPropertyValues;
 | 
			
		||||
import org.springframework.boot.bind.RelaxedDataBinder;
 | 
			
		||||
import org.springframework.boot.context.event.ApplicationEnvironmentPreparedEvent;
 | 
			
		||||
import org.springframework.boot.context.event.ApplicationPreparedEvent;
 | 
			
		||||
import org.springframework.boot.context.properties.bind.Binder;
 | 
			
		||||
import org.springframework.boot.context.properties.bind.PropertySourcesPlaceholdersResolver;
 | 
			
		||||
import org.springframework.boot.context.properties.source.ConfigurationPropertySources;
 | 
			
		||||
import org.springframework.boot.env.EnumerableCompositePropertySource;
 | 
			
		||||
import org.springframework.boot.env.EnvironmentPostProcessor;
 | 
			
		||||
import org.springframework.boot.env.PropertySourcesLoader;
 | 
			
		||||
| 
						 | 
				
			
			@ -90,6 +91,7 @@ import org.springframework.util.StringUtils;
 | 
			
		|||
 * @author Stephane Nicoll
 | 
			
		||||
 * @author Andy Wilkinson
 | 
			
		||||
 * @author Eddú Meléndez
 | 
			
		||||
 * @author Madhura Bhave
 | 
			
		||||
 */
 | 
			
		||||
public class ConfigFileApplicationListener implements EnvironmentPostProcessor,
 | 
			
		||||
		ApplicationListener<ApplicationEvent>, Ordered {
 | 
			
		||||
| 
						 | 
				
			
			@ -256,8 +258,7 @@ public class ConfigFileApplicationListener implements EnvironmentPostProcessor,
 | 
			
		|||
		}
 | 
			
		||||
 | 
			
		||||
		private void reorderSources(ConfigurableEnvironment environment) {
 | 
			
		||||
			ConfigurationPropertySources
 | 
			
		||||
					.finishAndRelocate(environment.getPropertySources());
 | 
			
		||||
			LoadedPropertySources.finishAndRelocate(environment.getPropertySources());
 | 
			
		||||
			PropertySource<?> defaultProperties = environment.getPropertySources()
 | 
			
		||||
					.remove(DEFAULT_PROPERTIES);
 | 
			
		||||
			if (defaultProperties != null) {
 | 
			
		||||
| 
						 | 
				
			
			@ -344,11 +345,11 @@ public class ConfigFileApplicationListener implements EnvironmentPostProcessor,
 | 
			
		|||
			}
 | 
			
		||||
			// Any pre-existing active profiles set via property sources (e.g. System
 | 
			
		||||
			// properties) take precedence over those added in config files.
 | 
			
		||||
			SpringProfiles springProfiles = bindSpringProfiles(
 | 
			
		||||
					this.environment.getPropertySources());
 | 
			
		||||
			Set<Profile> activeProfiles = new LinkedHashSet<>(
 | 
			
		||||
					springProfiles.getActiveProfiles());
 | 
			
		||||
			activeProfiles.addAll(springProfiles.getIncludeProfiles());
 | 
			
		||||
			Set<Profile> active = getProfiles(this.environment, "spring.profiles.active");
 | 
			
		||||
			Set<Profile> activeProfiles = new LinkedHashSet<>(active);
 | 
			
		||||
			Set<Profile> include = getProfiles(this.environment,
 | 
			
		||||
					"spring.profiles.include");
 | 
			
		||||
			activeProfiles.addAll(include);
 | 
			
		||||
			maybeActivateProfiles(activeProfiles);
 | 
			
		||||
			return activeProfiles;
 | 
			
		||||
		}
 | 
			
		||||
| 
						 | 
				
			
			@ -474,33 +475,34 @@ public class ConfigFileApplicationListener implements EnvironmentPostProcessor,
 | 
			
		|||
		}
 | 
			
		||||
 | 
			
		||||
		private void handleProfileProperties(PropertySource<?> propertySource) {
 | 
			
		||||
			SpringProfiles springProfiles = bindSpringProfiles(propertySource);
 | 
			
		||||
			maybeActivateProfiles(springProfiles.getActiveProfiles());
 | 
			
		||||
			addProfiles(springProfiles.getIncludeProfiles());
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		private SpringProfiles bindSpringProfiles(PropertySource<?> propertySource) {
 | 
			
		||||
			MutablePropertySources propertySources = new MutablePropertySources();
 | 
			
		||||
			propertySources.addFirst(propertySource);
 | 
			
		||||
			return bindSpringProfiles(propertySources);
 | 
			
		||||
			Set<Profile> active = getProfiles(propertySources, "spring.profiles.active");
 | 
			
		||||
			Set<Profile> include = getProfiles(propertySources,
 | 
			
		||||
					"spring.profiles.include");
 | 
			
		||||
			maybeActivateProfiles(active);
 | 
			
		||||
			addProfiles(include);
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		private SpringProfiles bindSpringProfiles(PropertySources propertySources) {
 | 
			
		||||
			SpringProfiles springProfiles = new SpringProfiles();
 | 
			
		||||
			RelaxedDataBinder dataBinder = new RelaxedDataBinder(springProfiles,
 | 
			
		||||
					"spring.profiles");
 | 
			
		||||
			dataBinder.bind(new PropertySourcesPropertyValues(propertySources, false));
 | 
			
		||||
			springProfiles.setActive(resolvePlaceholders(springProfiles.getActive()));
 | 
			
		||||
			springProfiles.setInclude(resolvePlaceholders(springProfiles.getInclude()));
 | 
			
		||||
			return springProfiles;
 | 
			
		||||
		private Set<Profile> getProfiles(ConfigurableEnvironment environment,
 | 
			
		||||
				String name) {
 | 
			
		||||
			return getProfiles(environment.getPropertySources(), name);
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		private List<String> resolvePlaceholders(List<String> values) {
 | 
			
		||||
			List<String> resolved = new ArrayList<>();
 | 
			
		||||
			for (String value : values) {
 | 
			
		||||
				resolved.add(this.environment.resolvePlaceholders(value));
 | 
			
		||||
		private Set<Profile> getProfiles(PropertySources sources, String name) {
 | 
			
		||||
			Binder binder = new Binder(ConfigurationPropertySources.get(sources),
 | 
			
		||||
					new PropertySourcesPlaceholdersResolver(this.environment));
 | 
			
		||||
			return binder.bind(name, String[].class).map(this::asProfileSet)
 | 
			
		||||
					.orElse(Collections.emptySet());
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		private Set<Profile> asProfileSet(String[] profileNames) {
 | 
			
		||||
			List<Profile> profiles = new ArrayList<>();
 | 
			
		||||
			for (String profileName : profileNames) {
 | 
			
		||||
				profiles.add(new Profile(profileName));
 | 
			
		||||
			}
 | 
			
		||||
			return resolved;
 | 
			
		||||
			Collections.reverse(profiles);
 | 
			
		||||
			return new LinkedHashSet<>(profiles);
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		private void maybeActivateProfiles(Set<Profile> profiles) {
 | 
			
		||||
| 
						 | 
				
			
			@ -601,19 +603,17 @@ public class ConfigFileApplicationListener implements EnvironmentPostProcessor,
 | 
			
		|||
			for (PropertySource<?> item : sources) {
 | 
			
		||||
				reorderedSources.add(item);
 | 
			
		||||
			}
 | 
			
		||||
			addConfigurationProperties(
 | 
			
		||||
					new ConfigurationPropertySources(reorderedSources));
 | 
			
		||||
			addConfigurationProperties(new LoadedPropertySources(reorderedSources));
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		private void addConfigurationProperties(
 | 
			
		||||
				ConfigurationPropertySources configurationSources) {
 | 
			
		||||
		private void addConfigurationProperties(LoadedPropertySources loadedSources) {
 | 
			
		||||
			MutablePropertySources existingSources = this.environment
 | 
			
		||||
					.getPropertySources();
 | 
			
		||||
			if (existingSources.contains(DEFAULT_PROPERTIES)) {
 | 
			
		||||
				existingSources.addBefore(DEFAULT_PROPERTIES, configurationSources);
 | 
			
		||||
				existingSources.addBefore(DEFAULT_PROPERTIES, loadedSources);
 | 
			
		||||
			}
 | 
			
		||||
			else {
 | 
			
		||||
				existingSources.addLast(configurationSources);
 | 
			
		||||
				existingSources.addLast(loadedSources);
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -670,14 +670,14 @@ public class ConfigFileApplicationListener implements EnvironmentPostProcessor,
 | 
			
		|||
	 * Holds the configuration {@link PropertySource}s as they are loaded can relocate
 | 
			
		||||
	 * them once configuration classes have been processed.
 | 
			
		||||
	 */
 | 
			
		||||
	static class ConfigurationPropertySources
 | 
			
		||||
	static class LoadedPropertySources
 | 
			
		||||
			extends EnumerablePropertySource<Collection<PropertySource<?>>> {
 | 
			
		||||
 | 
			
		||||
		private final Collection<PropertySource<?>> sources;
 | 
			
		||||
 | 
			
		||||
		private final String[] names;
 | 
			
		||||
 | 
			
		||||
		ConfigurationPropertySources(Collection<PropertySource<?>> sources) {
 | 
			
		||||
		LoadedPropertySources(Collection<PropertySource<?>> sources) {
 | 
			
		||||
			super(APPLICATION_CONFIGURATION_PROPERTY_SOURCE_NAME, sources);
 | 
			
		||||
			this.sources = sources;
 | 
			
		||||
			List<String> names = new ArrayList<>();
 | 
			
		||||
| 
						 | 
				
			
			@ -703,7 +703,7 @@ public class ConfigFileApplicationListener implements EnvironmentPostProcessor,
 | 
			
		|||
 | 
			
		||||
		public static void finishAndRelocate(MutablePropertySources propertySources) {
 | 
			
		||||
			String name = APPLICATION_CONFIGURATION_PROPERTY_SOURCE_NAME;
 | 
			
		||||
			ConfigurationPropertySources removed = (ConfigurationPropertySources) propertySources
 | 
			
		||||
			LoadedPropertySources removed = (LoadedPropertySources) propertySources
 | 
			
		||||
					.get(name);
 | 
			
		||||
			if (removed != null) {
 | 
			
		||||
				for (PropertySource<?> propertySource : removed.sources) {
 | 
			
		||||
| 
						 | 
				
			
			@ -729,48 +729,4 @@ public class ConfigFileApplicationListener implements EnvironmentPostProcessor,
 | 
			
		|||
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	/**
 | 
			
		||||
	 * Holder for {@code spring.profiles} properties.
 | 
			
		||||
	 */
 | 
			
		||||
	static final class SpringProfiles {
 | 
			
		||||
 | 
			
		||||
		private List<String> active = new ArrayList<>();
 | 
			
		||||
 | 
			
		||||
		private List<String> include = new ArrayList<>();
 | 
			
		||||
 | 
			
		||||
		public List<String> getActive() {
 | 
			
		||||
			return this.active;
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		public void setActive(List<String> active) {
 | 
			
		||||
			this.active = active;
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		public List<String> getInclude() {
 | 
			
		||||
			return this.include;
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		public void setInclude(List<String> include) {
 | 
			
		||||
			this.include = include;
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		Set<Profile> getActiveProfiles() {
 | 
			
		||||
			return asProfileSet(this.active);
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		Set<Profile> getIncludeProfiles() {
 | 
			
		||||
			return asProfileSet(this.include);
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		private Set<Profile> asProfileSet(List<String> profileNames) {
 | 
			
		||||
			List<Profile> profiles = new ArrayList<>();
 | 
			
		||||
			for (String profileName : profileNames) {
 | 
			
		||||
				profiles.add(new Profile(profileName));
 | 
			
		||||
			}
 | 
			
		||||
			Collections.reverse(profiles);
 | 
			
		||||
			return new LinkedHashSet<>(profiles);
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -16,9 +16,9 @@
 | 
			
		|||
 | 
			
		||||
package org.springframework.boot.context.logging;
 | 
			
		||||
 | 
			
		||||
import java.util.Collections;
 | 
			
		||||
import java.util.List;
 | 
			
		||||
import java.util.Map;
 | 
			
		||||
import java.util.Map.Entry;
 | 
			
		||||
import java.util.concurrent.atomic.AtomicBoolean;
 | 
			
		||||
 | 
			
		||||
import org.apache.commons.logging.Log;
 | 
			
		||||
| 
						 | 
				
			
			@ -26,11 +26,12 @@ import org.apache.commons.logging.LogFactory;
 | 
			
		|||
 | 
			
		||||
import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;
 | 
			
		||||
import org.springframework.boot.SpringApplication;
 | 
			
		||||
import org.springframework.boot.bind.RelaxedPropertyResolver;
 | 
			
		||||
import org.springframework.boot.context.event.ApplicationEnvironmentPreparedEvent;
 | 
			
		||||
import org.springframework.boot.context.event.ApplicationFailedEvent;
 | 
			
		||||
import org.springframework.boot.context.event.ApplicationPreparedEvent;
 | 
			
		||||
import org.springframework.boot.context.event.ApplicationStartingEvent;
 | 
			
		||||
import org.springframework.boot.context.properties.bind.Bindable;
 | 
			
		||||
import org.springframework.boot.context.properties.bind.Binder;
 | 
			
		||||
import org.springframework.boot.logging.LogFile;
 | 
			
		||||
import org.springframework.boot.logging.LogLevel;
 | 
			
		||||
import org.springframework.boot.logging.LoggingInitializationContext;
 | 
			
		||||
| 
						 | 
				
			
			@ -77,11 +78,15 @@ import org.springframework.util.StringUtils;
 | 
			
		|||
 * @author Dave Syer
 | 
			
		||||
 * @author Phillip Webb
 | 
			
		||||
 * @author Andy Wilkinson
 | 
			
		||||
 * @author Madhura Bhave
 | 
			
		||||
 * @since 2.0.0
 | 
			
		||||
 * @see LoggingSystem#get(ClassLoader)
 | 
			
		||||
 */
 | 
			
		||||
public class LoggingApplicationListener implements GenericApplicationListener {
 | 
			
		||||
 | 
			
		||||
	private static final Bindable<Map<String, String>> STRING_STRING_MAP = Bindable
 | 
			
		||||
			.mapOf(String.class, String.class);
 | 
			
		||||
 | 
			
		||||
	/**
 | 
			
		||||
	 * The default order for the LoggingApplicationListener.
 | 
			
		||||
	 */
 | 
			
		||||
| 
						 | 
				
			
			@ -294,20 +299,18 @@ public class LoggingApplicationListener implements GenericApplicationListener {
 | 
			
		|||
	}
 | 
			
		||||
 | 
			
		||||
	protected void setLogLevels(LoggingSystem system, Environment environment) {
 | 
			
		||||
		Map<String, Object> levels = new RelaxedPropertyResolver(environment)
 | 
			
		||||
				.getSubProperties("logging.level.");
 | 
			
		||||
		for (Entry<String, Object> entry : levels.entrySet()) {
 | 
			
		||||
			setLogLevel(system, environment, entry.getKey(), entry.getValue().toString());
 | 
			
		||||
		if (!(environment instanceof ConfigurableEnvironment)) {
 | 
			
		||||
			return;
 | 
			
		||||
		}
 | 
			
		||||
		Binder binder = Binder.get(environment);
 | 
			
		||||
		binder.bind("logging.level", STRING_STRING_MAP).orElseGet(Collections::emptyMap)
 | 
			
		||||
				.forEach((name, level) -> setLogLevel(system, environment, name, level));
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	private void setLogLevel(LoggingSystem system, Environment environment, String name,
 | 
			
		||||
			String level) {
 | 
			
		||||
		try {
 | 
			
		||||
			if (name.equalsIgnoreCase(LoggingSystem.ROOT_LOGGER_NAME)) {
 | 
			
		||||
				name = null;
 | 
			
		||||
			}
 | 
			
		||||
			level = environment.resolvePlaceholders(level);
 | 
			
		||||
			name = (name.equalsIgnoreCase(LoggingSystem.ROOT_LOGGER_NAME) ? null : name);
 | 
			
		||||
			system.setLogLevel(name, coerceLogLevel(level));
 | 
			
		||||
		}
 | 
			
		||||
		catch (RuntimeException ex) {
 | 
			
		||||
| 
						 | 
				
			
			@ -324,7 +327,7 @@ public class LoggingApplicationListener implements GenericApplicationListener {
 | 
			
		|||
 | 
			
		||||
	private void registerShutdownHookIfNecessary(Environment environment,
 | 
			
		||||
			LoggingSystem loggingSystem) {
 | 
			
		||||
		boolean registerShutdownHook = new RelaxedPropertyResolver(environment)
 | 
			
		||||
		boolean registerShutdownHook = environment
 | 
			
		||||
				.getProperty(REGISTER_SHUTDOWN_HOOK_PROPERTY, Boolean.class, false);
 | 
			
		||||
		if (registerShutdownHook) {
 | 
			
		||||
			Runnable shutdownHandler = loggingSystem.getShutdownHandler();
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -17,7 +17,6 @@
 | 
			
		|||
package org.springframework.boot.context.properties;
 | 
			
		||||
 | 
			
		||||
import java.util.Collections;
 | 
			
		||||
import java.util.Iterator;
 | 
			
		||||
import java.util.List;
 | 
			
		||||
import java.util.Map;
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -34,7 +33,15 @@ import org.springframework.beans.factory.ListableBeanFactory;
 | 
			
		|||
import org.springframework.beans.factory.NoSuchBeanDefinitionException;
 | 
			
		||||
import org.springframework.beans.factory.annotation.Autowired;
 | 
			
		||||
import org.springframework.beans.factory.config.BeanPostProcessor;
 | 
			
		||||
import org.springframework.boot.bind.PropertiesConfigurationFactory;
 | 
			
		||||
import org.springframework.boot.context.properties.bind.BindHandler;
 | 
			
		||||
import org.springframework.boot.context.properties.bind.Bindable;
 | 
			
		||||
import org.springframework.boot.context.properties.bind.Binder;
 | 
			
		||||
import org.springframework.boot.context.properties.bind.PropertySourcesPlaceholdersResolver;
 | 
			
		||||
import org.springframework.boot.context.properties.bind.handler.IgnoreErrorsBindHandler;
 | 
			
		||||
import org.springframework.boot.context.properties.bind.handler.IgnoreNestedPropertiesBindHandler;
 | 
			
		||||
import org.springframework.boot.context.properties.bind.handler.NoUnboundElementsBindHandler;
 | 
			
		||||
import org.springframework.boot.context.properties.bind.validation.ValidationBindHandler;
 | 
			
		||||
import org.springframework.boot.context.properties.source.ConfigurationPropertySources;
 | 
			
		||||
import org.springframework.boot.validation.MessageInterpolatorFactory;
 | 
			
		||||
import org.springframework.context.ApplicationContext;
 | 
			
		||||
import org.springframework.context.ApplicationContextAware;
 | 
			
		||||
| 
						 | 
				
			
			@ -53,13 +60,10 @@ import org.springframework.core.convert.converter.GenericConverter;
 | 
			
		|||
import org.springframework.core.convert.support.DefaultConversionService;
 | 
			
		||||
import org.springframework.core.env.ConfigurableEnvironment;
 | 
			
		||||
import org.springframework.core.env.Environment;
 | 
			
		||||
import org.springframework.core.env.MutablePropertySources;
 | 
			
		||||
import org.springframework.core.env.PropertySource;
 | 
			
		||||
import org.springframework.core.env.PropertySources;
 | 
			
		||||
import org.springframework.core.env.StandardEnvironment;
 | 
			
		||||
import org.springframework.util.Assert;
 | 
			
		||||
import org.springframework.util.ClassUtils;
 | 
			
		||||
import org.springframework.util.StringUtils;
 | 
			
		||||
import org.springframework.validation.Errors;
 | 
			
		||||
import org.springframework.validation.Validator;
 | 
			
		||||
import org.springframework.validation.annotation.Validated;
 | 
			
		||||
| 
						 | 
				
			
			@ -73,6 +77,7 @@ import org.springframework.validation.beanvalidation.LocalValidatorFactoryBean;
 | 
			
		|||
 * @author Phillip Webb
 | 
			
		||||
 * @author Christian Dupuis
 | 
			
		||||
 * @author Stephane Nicoll
 | 
			
		||||
 * @author Madhura Bhave
 | 
			
		||||
 */
 | 
			
		||||
public class ConfigurationPropertiesBindingPostProcessor implements BeanPostProcessor,
 | 
			
		||||
		BeanFactoryAware, EnvironmentAware, ApplicationContextAware, InitializingBean,
 | 
			
		||||
| 
						 | 
				
			
			@ -113,6 +118,10 @@ public class ConfigurationPropertiesBindingPostProcessor implements BeanPostProc
 | 
			
		|||
 | 
			
		||||
	private int order = Ordered.HIGHEST_PRECEDENCE + 1;
 | 
			
		||||
 | 
			
		||||
	private ConfigurationPropertySources configurationSources;
 | 
			
		||||
 | 
			
		||||
	private Binder binder;
 | 
			
		||||
 | 
			
		||||
	/**
 | 
			
		||||
	 * A list of custom converters (in addition to the defaults) to use when converting
 | 
			
		||||
	 * properties for binding.
 | 
			
		||||
| 
						 | 
				
			
			@ -212,6 +221,8 @@ public class ConfigurationPropertiesBindingPostProcessor implements BeanPostProc
 | 
			
		|||
					ConfigurableApplicationContext.CONVERSION_SERVICE_BEAN_NAME,
 | 
			
		||||
					ConversionService.class);
 | 
			
		||||
		}
 | 
			
		||||
		this.configurationSources = ConfigurationPropertySources
 | 
			
		||||
				.get(this.propertySources);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	@Override
 | 
			
		||||
| 
						 | 
				
			
			@ -240,18 +251,13 @@ public class ConfigurationPropertiesBindingPostProcessor implements BeanPostProc
 | 
			
		|||
	private PropertySources deducePropertySources() {
 | 
			
		||||
		PropertySourcesPlaceholderConfigurer configurer = getSinglePropertySourcesPlaceholderConfigurer();
 | 
			
		||||
		if (configurer != null) {
 | 
			
		||||
			// Flatten the sources into a single list so they can be iterated
 | 
			
		||||
			return new FlatPropertySources(configurer.getAppliedPropertySources());
 | 
			
		||||
			return configurer.getAppliedPropertySources();
 | 
			
		||||
		}
 | 
			
		||||
		if (this.environment instanceof ConfigurableEnvironment) {
 | 
			
		||||
			MutablePropertySources propertySources = ((ConfigurableEnvironment) this.environment)
 | 
			
		||||
					.getPropertySources();
 | 
			
		||||
			return new FlatPropertySources(propertySources);
 | 
			
		||||
			return ((ConfigurableEnvironment) this.environment).getPropertySources();
 | 
			
		||||
		}
 | 
			
		||||
		// empty, so not very useful, but fulfils the contract
 | 
			
		||||
		logger.warn("Unable to obtain PropertySources from "
 | 
			
		||||
		throw new IllegalStateException("Unable to obtain PropertySources from "
 | 
			
		||||
				+ "PropertySourcesPlaceholderConfigurer or Environment");
 | 
			
		||||
		return new MutablePropertySources();
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	private PropertySourcesPlaceholderConfigurer getSinglePropertySourcesPlaceholderConfigurer() {
 | 
			
		||||
| 
						 | 
				
			
			@ -287,15 +293,16 @@ public class ConfigurationPropertiesBindingPostProcessor implements BeanPostProc
 | 
			
		|||
			throws BeansException {
 | 
			
		||||
		ConfigurationProperties annotation = AnnotationUtils
 | 
			
		||||
				.findAnnotation(bean.getClass(), ConfigurationProperties.class);
 | 
			
		||||
		Object bound = bean;
 | 
			
		||||
		if (annotation != null) {
 | 
			
		||||
			postProcessBeforeInitialization(bean, beanName, annotation);
 | 
			
		||||
			bound = postProcessBeforeInitialization(bean, beanName, annotation);
 | 
			
		||||
		}
 | 
			
		||||
		annotation = this.beans.findFactoryAnnotation(beanName,
 | 
			
		||||
				ConfigurationProperties.class);
 | 
			
		||||
		if (annotation != null) {
 | 
			
		||||
			postProcessBeforeInitialization(bean, beanName, annotation);
 | 
			
		||||
			bound = postProcessBeforeInitialization(bean, beanName, annotation);
 | 
			
		||||
		}
 | 
			
		||||
		return bean;
 | 
			
		||||
		return bound;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	@Override
 | 
			
		||||
| 
						 | 
				
			
			@ -304,35 +311,53 @@ public class ConfigurationPropertiesBindingPostProcessor implements BeanPostProc
 | 
			
		|||
		return bean;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	private void postProcessBeforeInitialization(Object bean, String beanName,
 | 
			
		||||
	private Object postProcessBeforeInitialization(Object bean, String beanName,
 | 
			
		||||
			ConfigurationProperties annotation) {
 | 
			
		||||
		Object target = bean;
 | 
			
		||||
		PropertiesConfigurationFactory<Object> factory = new PropertiesConfigurationFactory<>(
 | 
			
		||||
				target);
 | 
			
		||||
		factory.setPropertySources(this.propertySources);
 | 
			
		||||
		factory.setValidator(determineValidator(bean));
 | 
			
		||||
		// If no explicit conversion service is provided we add one so that (at least)
 | 
			
		||||
		// comma-separated arrays of convertibles can be bound automatically
 | 
			
		||||
		factory.setConversionService(this.conversionService == null
 | 
			
		||||
				? getDefaultConversionService() : this.conversionService);
 | 
			
		||||
		if (annotation != null) {
 | 
			
		||||
			factory.setIgnoreInvalidFields(annotation.ignoreInvalidFields());
 | 
			
		||||
			factory.setIgnoreUnknownFields(annotation.ignoreUnknownFields());
 | 
			
		||||
			factory.setIgnoreNestedProperties(annotation.ignoreNestedProperties());
 | 
			
		||||
			if (StringUtils.hasLength(annotation.prefix())) {
 | 
			
		||||
				factory.setTargetName(annotation.prefix());
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
		Binder binder = getBinder();
 | 
			
		||||
		Validator validator = determineValidator(bean);
 | 
			
		||||
		BindHandler handler = getBindHandler(annotation, validator);
 | 
			
		||||
		Bindable<?> bindable = Bindable.ofInstance(bean);
 | 
			
		||||
		try {
 | 
			
		||||
			factory.bindPropertiesToTarget();
 | 
			
		||||
			binder.bind(annotation.prefix(), bindable, handler);
 | 
			
		||||
			return bean;
 | 
			
		||||
		}
 | 
			
		||||
		catch (Exception ex) {
 | 
			
		||||
			String targetClass = ClassUtils.getShortName(target.getClass());
 | 
			
		||||
			String targetClass = ClassUtils.getShortName(bean.getClass());
 | 
			
		||||
			throw new BeanCreationException(beanName, "Could not bind properties to "
 | 
			
		||||
					+ targetClass + " (" + getAnnotationDetails(annotation) + ")", ex);
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	private Binder getBinder() {
 | 
			
		||||
		Binder binder = this.binder;
 | 
			
		||||
		if (binder == null) {
 | 
			
		||||
			ConversionService conversionService = this.conversionService;
 | 
			
		||||
			if (conversionService == null) {
 | 
			
		||||
				conversionService = getDefaultConversionService();
 | 
			
		||||
			}
 | 
			
		||||
			binder = new Binder(this.configurationSources,
 | 
			
		||||
					new PropertySourcesPlaceholdersResolver(this.propertySources),
 | 
			
		||||
					conversionService);
 | 
			
		||||
			this.binder = binder;
 | 
			
		||||
		}
 | 
			
		||||
		return binder;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	private ConversionService getDefaultConversionService() {
 | 
			
		||||
		if (this.defaultConversionService == null) {
 | 
			
		||||
			DefaultConversionService conversionService = new DefaultConversionService();
 | 
			
		||||
			this.applicationContext.getAutowireCapableBeanFactory().autowireBean(this);
 | 
			
		||||
			for (Converter<?, ?> converter : this.converters) {
 | 
			
		||||
				conversionService.addConverter(converter);
 | 
			
		||||
			}
 | 
			
		||||
			for (GenericConverter genericConverter : this.genericConverters) {
 | 
			
		||||
				conversionService.addConverter(genericConverter);
 | 
			
		||||
			}
 | 
			
		||||
			this.defaultConversionService = conversionService;
 | 
			
		||||
		}
 | 
			
		||||
		return this.defaultConversionService;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	private String getAnnotationDetails(ConfigurationProperties annotation) {
 | 
			
		||||
		if (annotation == null) {
 | 
			
		||||
			return "";
 | 
			
		||||
| 
						 | 
				
			
			@ -379,19 +404,22 @@ public class ConfigurationPropertiesBindingPostProcessor implements BeanPostProc
 | 
			
		|||
		return true;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	private ConversionService getDefaultConversionService() {
 | 
			
		||||
		if (this.defaultConversionService == null) {
 | 
			
		||||
			DefaultConversionService conversionService = new DefaultConversionService();
 | 
			
		||||
			this.applicationContext.getAutowireCapableBeanFactory().autowireBean(this);
 | 
			
		||||
			for (Converter<?, ?> converter : this.converters) {
 | 
			
		||||
				conversionService.addConverter(converter);
 | 
			
		||||
			}
 | 
			
		||||
			for (GenericConverter genericConverter : this.genericConverters) {
 | 
			
		||||
				conversionService.addConverter(genericConverter);
 | 
			
		||||
			}
 | 
			
		||||
			this.defaultConversionService = conversionService;
 | 
			
		||||
	private BindHandler getBindHandler(ConfigurationProperties annotation,
 | 
			
		||||
			Validator validator) {
 | 
			
		||||
		BindHandler handler = BindHandler.DEFAULT;
 | 
			
		||||
		if (annotation.ignoreInvalidFields()) {
 | 
			
		||||
			handler = new IgnoreErrorsBindHandler(handler);
 | 
			
		||||
		}
 | 
			
		||||
		return this.defaultConversionService;
 | 
			
		||||
		if (!annotation.ignoreUnknownFields()) {
 | 
			
		||||
			handler = new NoUnboundElementsBindHandler(handler);
 | 
			
		||||
		}
 | 
			
		||||
		if (annotation.ignoreNestedProperties()) {
 | 
			
		||||
			handler = new IgnoreNestedPropertiesBindHandler(handler);
 | 
			
		||||
		}
 | 
			
		||||
		if (validator != null) {
 | 
			
		||||
			handler = new ValidationBindHandler(handler, validator);
 | 
			
		||||
		}
 | 
			
		||||
		return handler;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	/**
 | 
			
		||||
| 
						 | 
				
			
			@ -465,56 +493,4 @@ public class ConfigurationPropertiesBindingPostProcessor implements BeanPostProc
 | 
			
		|||
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	/**
 | 
			
		||||
	 * Convenience class to flatten out a tree of property sources without losing the
 | 
			
		||||
	 * reference to the backing data (which can therefore be updated in the background).
 | 
			
		||||
	 */
 | 
			
		||||
	private static class FlatPropertySources implements PropertySources {
 | 
			
		||||
 | 
			
		||||
		private PropertySources propertySources;
 | 
			
		||||
 | 
			
		||||
		FlatPropertySources(PropertySources propertySources) {
 | 
			
		||||
			this.propertySources = propertySources;
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		@Override
 | 
			
		||||
		public Iterator<PropertySource<?>> iterator() {
 | 
			
		||||
			MutablePropertySources result = getFlattened();
 | 
			
		||||
			return result.iterator();
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		@Override
 | 
			
		||||
		public boolean contains(String name) {
 | 
			
		||||
			return get(name) != null;
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		@Override
 | 
			
		||||
		public PropertySource<?> get(String name) {
 | 
			
		||||
			return getFlattened().get(name);
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		private MutablePropertySources getFlattened() {
 | 
			
		||||
			MutablePropertySources result = new MutablePropertySources();
 | 
			
		||||
			for (PropertySource<?> propertySource : this.propertySources) {
 | 
			
		||||
				flattenPropertySources(propertySource, result);
 | 
			
		||||
			}
 | 
			
		||||
			return result;
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		private void flattenPropertySources(PropertySource<?> propertySource,
 | 
			
		||||
				MutablePropertySources result) {
 | 
			
		||||
			Object source = propertySource.getSource();
 | 
			
		||||
			if (source instanceof ConfigurableEnvironment) {
 | 
			
		||||
				ConfigurableEnvironment environment = (ConfigurableEnvironment) source;
 | 
			
		||||
				for (PropertySource<?> childSource : environment.getPropertySources()) {
 | 
			
		||||
					flattenPropertySources(childSource, result);
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
			else {
 | 
			
		||||
				result.addLast(propertySource);
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,5 +1,5 @@
 | 
			
		|||
/*
 | 
			
		||||
 * Copyright 2012-2013 the original author or authors.
 | 
			
		||||
 * Copyright 2012-2017 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.
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -45,6 +45,7 @@ import org.springframework.util.StringUtils;
 | 
			
		|||
 * @author Christian Dupuis
 | 
			
		||||
 * @author Stephane Nicoll
 | 
			
		||||
 */
 | 
			
		||||
@Deprecated
 | 
			
		||||
class EnableConfigurationPropertiesImportSelector implements ImportSelector {
 | 
			
		||||
 | 
			
		||||
	@Override
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -0,0 +1,73 @@
 | 
			
		|||
/*
 | 
			
		||||
 * Copyright 2012-2017 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.
 | 
			
		||||
 * You may obtain a copy of the License at
 | 
			
		||||
 *
 | 
			
		||||
 *      http://www.apache.org/licenses/LICENSE-2.0
 | 
			
		||||
 *
 | 
			
		||||
 * Unless required by applicable law or agreed to in writing, software
 | 
			
		||||
 * distributed under the License is distributed on an "AS IS" BASIS,
 | 
			
		||||
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | 
			
		||||
 * See the License for the specific language governing permissions and
 | 
			
		||||
 * limitations under the License.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
package org.springframework.boot.context.properties.bind;
 | 
			
		||||
 | 
			
		||||
import org.springframework.boot.context.properties.source.ConfigurationPropertyName;
 | 
			
		||||
import org.springframework.util.Assert;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Abstract base class for {@link BindHandler} implementations.
 | 
			
		||||
 *
 | 
			
		||||
 * @author Phillip Webb
 | 
			
		||||
 * @author Madhura Bhave
 | 
			
		||||
 * @since 2.0.0
 | 
			
		||||
 */
 | 
			
		||||
public abstract class AbstractBindHandler implements BindHandler {
 | 
			
		||||
 | 
			
		||||
	private final BindHandler parent;
 | 
			
		||||
 | 
			
		||||
	/**
 | 
			
		||||
	 * Create a new binding handler instance.
 | 
			
		||||
	 */
 | 
			
		||||
	public AbstractBindHandler() {
 | 
			
		||||
		this(BindHandler.DEFAULT);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	/**
 | 
			
		||||
	 * Create a new binding handler instance with a specific parent.
 | 
			
		||||
	 * @param parent the parent handler
 | 
			
		||||
	 */
 | 
			
		||||
	public AbstractBindHandler(BindHandler parent) {
 | 
			
		||||
		Assert.notNull(parent, "Parent must not be null");
 | 
			
		||||
		this.parent = parent;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	@Override
 | 
			
		||||
	public boolean onStart(ConfigurationPropertyName name, Bindable<?> target,
 | 
			
		||||
			BindContext context) {
 | 
			
		||||
		return this.parent.onStart(name, target, context);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	@Override
 | 
			
		||||
	public Object onSuccess(ConfigurationPropertyName name, Bindable<?> target,
 | 
			
		||||
			BindContext context, Object result) {
 | 
			
		||||
		return this.parent.onSuccess(name, target, context, result);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	@Override
 | 
			
		||||
	public Object onFailure(ConfigurationPropertyName name, Bindable<?> target,
 | 
			
		||||
			BindContext context, Exception error) throws Exception {
 | 
			
		||||
		return this.parent.onFailure(name, target, context, error);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	@Override
 | 
			
		||||
	public void onFinish(ConfigurationPropertyName name, Bindable<?> target,
 | 
			
		||||
			BindContext context, Object result) throws Exception {
 | 
			
		||||
		this.parent.onFinish(name, target, context, result);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
Some files were not shown because too many files have changed in this diff Show More
		Loading…
	
		Reference in New Issue