Merge pull request #9259 from Ethan Rubinson
* gh-9259: Polish "Copy conversion service when performing environment conversion" Copy conversion service when performing environment conversion
This commit is contained in:
commit
197c0cefbb
|
@ -0,0 +1,122 @@
|
||||||
|
/*
|
||||||
|
* 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;
|
||||||
|
|
||||||
|
import java.util.Collections;
|
||||||
|
import java.util.HashSet;
|
||||||
|
import java.util.Set;
|
||||||
|
|
||||||
|
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.StandardEnvironment;
|
||||||
|
import org.springframework.util.ClassUtils;
|
||||||
|
import org.springframework.web.context.ConfigurableWebEnvironment;
|
||||||
|
import org.springframework.web.context.support.StandardServletEnvironment;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Utility class for converting one type of {@link Environment} to another.
|
||||||
|
*
|
||||||
|
* @author Ethan Rubinson
|
||||||
|
* @author Andy Wilkinson
|
||||||
|
*/
|
||||||
|
final class EnvironmentConverter {
|
||||||
|
|
||||||
|
private static final String CONFIGURABLE_WEB_ENVIRONMENT_CLASS = "org.springframework.web.context.ConfigurableWebEnvironment";
|
||||||
|
|
||||||
|
private static final Set<String> SERVLET_ENVIRONMENT_SOURCE_NAMES;
|
||||||
|
|
||||||
|
static {
|
||||||
|
final Set<String> names = new HashSet<String>();
|
||||||
|
names.add(StandardServletEnvironment.SERVLET_CONTEXT_PROPERTY_SOURCE_NAME);
|
||||||
|
names.add(StandardServletEnvironment.SERVLET_CONFIG_PROPERTY_SOURCE_NAME);
|
||||||
|
names.add(StandardServletEnvironment.JNDI_PROPERTY_SOURCE_NAME);
|
||||||
|
SERVLET_ENVIRONMENT_SOURCE_NAMES = Collections.unmodifiableSet(names);
|
||||||
|
}
|
||||||
|
|
||||||
|
private final ClassLoader classLoader;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Creates a new {@link EnvironmentConverter} that will use the given
|
||||||
|
* {@code classLoader} during conversion.
|
||||||
|
* @param classLoader the class loader to use
|
||||||
|
*/
|
||||||
|
EnvironmentConverter(ClassLoader classLoader) {
|
||||||
|
this.classLoader = classLoader;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Converts the given {@code environment} to a {@link StandardEnvironment}. If the
|
||||||
|
* environment is already a {@code StandardEnvironment} and is not a
|
||||||
|
* {@link ConfigurableWebEnvironment} no conversion is performed and it is returned
|
||||||
|
* unchanged.
|
||||||
|
*
|
||||||
|
* @param environment The Environment to convert
|
||||||
|
* @return The converted Environment
|
||||||
|
*/
|
||||||
|
StandardEnvironment convertToStandardEnvironmentIfNecessary(
|
||||||
|
ConfigurableEnvironment environment) {
|
||||||
|
if (environment instanceof StandardEnvironment
|
||||||
|
&& !isWebEnvironment(environment, this.classLoader)) {
|
||||||
|
return (StandardEnvironment) environment;
|
||||||
|
}
|
||||||
|
return convertToStandardEnvironment(environment);
|
||||||
|
}
|
||||||
|
|
||||||
|
private boolean isWebEnvironment(ConfigurableEnvironment environment,
|
||||||
|
ClassLoader classLoader) {
|
||||||
|
try {
|
||||||
|
Class<?> webEnvironmentClass = ClassUtils
|
||||||
|
.forName(CONFIGURABLE_WEB_ENVIRONMENT_CLASS, classLoader);
|
||||||
|
return (webEnvironmentClass.isInstance(environment));
|
||||||
|
}
|
||||||
|
catch (Throwable ex) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private StandardEnvironment convertToStandardEnvironment(
|
||||||
|
ConfigurableEnvironment environment) {
|
||||||
|
StandardEnvironment result = new StandardEnvironment();
|
||||||
|
result.setActiveProfiles(environment.getActiveProfiles());
|
||||||
|
result.setConversionService(environment.getConversionService());
|
||||||
|
copyNonServletPropertySources(environment, result);
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void copyNonServletPropertySources(ConfigurableEnvironment source,
|
||||||
|
StandardEnvironment target) {
|
||||||
|
removeAllPropertySources(target.getPropertySources());
|
||||||
|
for (PropertySource<?> propertySource : source.getPropertySources()) {
|
||||||
|
if (!SERVLET_ENVIRONMENT_SOURCE_NAMES.contains(propertySource.getName())) {
|
||||||
|
target.getPropertySources().addLast(propertySource);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void removeAllPropertySources(MutablePropertySources propertySources) {
|
||||||
|
Set<String> names = new HashSet<String>();
|
||||||
|
for (PropertySource<?> propertySource : propertySources) {
|
||||||
|
names.add(propertySource.getName());
|
||||||
|
}
|
||||||
|
for (String name : names) {
|
||||||
|
propertySources.remove(name);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -140,6 +140,7 @@ import org.springframework.web.context.support.StandardServletEnvironment;
|
||||||
* @author Jeremy Rickard
|
* @author Jeremy Rickard
|
||||||
* @author Craig Burke
|
* @author Craig Burke
|
||||||
* @author Michael Simons
|
* @author Michael Simons
|
||||||
|
* @author Ethan Rubinson
|
||||||
* @see #run(Object, String[])
|
* @see #run(Object, String[])
|
||||||
* @see #run(Object[], String[])
|
* @see #run(Object[], String[])
|
||||||
* @see #SpringApplication(Object...)
|
* @see #SpringApplication(Object...)
|
||||||
|
@ -173,20 +174,8 @@ public class SpringApplication {
|
||||||
*/
|
*/
|
||||||
public static final String BANNER_LOCATION_PROPERTY = SpringApplicationBannerPrinter.BANNER_LOCATION_PROPERTY;
|
public static final String BANNER_LOCATION_PROPERTY = SpringApplicationBannerPrinter.BANNER_LOCATION_PROPERTY;
|
||||||
|
|
||||||
private static final String CONFIGURABLE_WEB_ENVIRONMENT_CLASS = "org.springframework.web.context.ConfigurableWebEnvironment";
|
|
||||||
|
|
||||||
private static final String SYSTEM_PROPERTY_JAVA_AWT_HEADLESS = "java.awt.headless";
|
private static final String SYSTEM_PROPERTY_JAVA_AWT_HEADLESS = "java.awt.headless";
|
||||||
|
|
||||||
private static final Set<String> SERVLET_ENVIRONMENT_SOURCE_NAMES;
|
|
||||||
|
|
||||||
static {
|
|
||||||
Set<String> names = new HashSet<String>();
|
|
||||||
names.add(StandardServletEnvironment.SERVLET_CONTEXT_PROPERTY_SOURCE_NAME);
|
|
||||||
names.add(StandardServletEnvironment.SERVLET_CONFIG_PROPERTY_SOURCE_NAME);
|
|
||||||
names.add(StandardServletEnvironment.JNDI_PROPERTY_SOURCE_NAME);
|
|
||||||
SERVLET_ENVIRONMENT_SOURCE_NAMES = Collections.unmodifiableSet(names);
|
|
||||||
}
|
|
||||||
|
|
||||||
private static final Log logger = LogFactory.getLog(SpringApplication.class);
|
private static final Log logger = LogFactory.getLog(SpringApplication.class);
|
||||||
|
|
||||||
private final Set<Object> sources = new LinkedHashSet<Object>();
|
private final Set<Object> sources = new LinkedHashSet<Object>();
|
||||||
|
@ -334,8 +323,9 @@ public class SpringApplication {
|
||||||
ConfigurableEnvironment environment = getOrCreateEnvironment();
|
ConfigurableEnvironment environment = getOrCreateEnvironment();
|
||||||
configureEnvironment(environment, applicationArguments.getSourceArgs());
|
configureEnvironment(environment, applicationArguments.getSourceArgs());
|
||||||
listeners.environmentPrepared(environment);
|
listeners.environmentPrepared(environment);
|
||||||
if (isWebEnvironment(environment) && !this.webEnvironment) {
|
if (!this.webEnvironment) {
|
||||||
environment = convertToStandardEnvironment(environment);
|
environment = new EnvironmentConverter(getClassLoader())
|
||||||
|
.convertToStandardEnvironmentIfNecessary(environment);
|
||||||
}
|
}
|
||||||
return environment;
|
return environment;
|
||||||
}
|
}
|
||||||
|
@ -454,40 +444,6 @@ public class SpringApplication {
|
||||||
configureProfiles(environment, args);
|
configureProfiles(environment, args);
|
||||||
}
|
}
|
||||||
|
|
||||||
private boolean isWebEnvironment(ConfigurableEnvironment environment) {
|
|
||||||
try {
|
|
||||||
Class<?> webEnvironmentClass = ClassUtils
|
|
||||||
.forName(CONFIGURABLE_WEB_ENVIRONMENT_CLASS, getClassLoader());
|
|
||||||
return (webEnvironmentClass.isInstance(environment));
|
|
||||||
}
|
|
||||||
catch (Throwable ex) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private ConfigurableEnvironment convertToStandardEnvironment(
|
|
||||||
ConfigurableEnvironment environment) {
|
|
||||||
StandardEnvironment result = new StandardEnvironment();
|
|
||||||
removeAllPropertySources(result.getPropertySources());
|
|
||||||
result.setActiveProfiles(environment.getActiveProfiles());
|
|
||||||
for (PropertySource<?> propertySource : environment.getPropertySources()) {
|
|
||||||
if (!SERVLET_ENVIRONMENT_SOURCE_NAMES.contains(propertySource.getName())) {
|
|
||||||
result.getPropertySources().addLast(propertySource);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
private void removeAllPropertySources(MutablePropertySources propertySources) {
|
|
||||||
Set<String> names = new HashSet<String>();
|
|
||||||
for (PropertySource<?> propertySource : propertySources) {
|
|
||||||
names.add(propertySource.getName());
|
|
||||||
}
|
|
||||||
for (String name : names) {
|
|
||||||
propertySources.remove(name);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Add, remove or re-order any {@link PropertySource}s in this application's
|
* Add, remove or re-order any {@link PropertySource}s in this application's
|
||||||
* environment.
|
* environment.
|
||||||
|
|
|
@ -0,0 +1,79 @@
|
||||||
|
/*
|
||||||
|
* 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;
|
||||||
|
|
||||||
|
import org.junit.Test;
|
||||||
|
|
||||||
|
import org.springframework.core.convert.support.ConfigurableConversionService;
|
||||||
|
import org.springframework.core.env.AbstractEnvironment;
|
||||||
|
import org.springframework.core.env.StandardEnvironment;
|
||||||
|
import org.springframework.mock.env.MockEnvironment;
|
||||||
|
import org.springframework.web.context.support.StandardServletEnvironment;
|
||||||
|
|
||||||
|
import static org.assertj.core.api.Assertions.assertThat;
|
||||||
|
import static org.mockito.Mockito.mock;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Tests for {@link EnvironmentConverter}.
|
||||||
|
*
|
||||||
|
* @author Ethan Rubinson
|
||||||
|
* @author Andy Wilkinson
|
||||||
|
*/
|
||||||
|
public class EnvironmentConverterTests {
|
||||||
|
|
||||||
|
private final EnvironmentConverter environmentConverter = new EnvironmentConverter(
|
||||||
|
getClass().getClassLoader());
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void convertedEnvironmentHasSameActiveProfiles() {
|
||||||
|
AbstractEnvironment originalEnvironment = new MockEnvironment();
|
||||||
|
originalEnvironment.setActiveProfiles("activeProfile1", "activeProfile2");
|
||||||
|
StandardEnvironment convertedEnvironment = this.environmentConverter
|
||||||
|
.convertToStandardEnvironmentIfNecessary(originalEnvironment);
|
||||||
|
assertThat(convertedEnvironment.getActiveProfiles())
|
||||||
|
.containsExactly("activeProfile1", "activeProfile2");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void convertedEnvironmentHasSameConversionService() {
|
||||||
|
AbstractEnvironment originalEnvironment = new MockEnvironment();
|
||||||
|
ConfigurableConversionService conversionService = mock(
|
||||||
|
ConfigurableConversionService.class);
|
||||||
|
originalEnvironment.setConversionService(conversionService);
|
||||||
|
StandardEnvironment convertedEnvironment = this.environmentConverter
|
||||||
|
.convertToStandardEnvironmentIfNecessary(originalEnvironment);
|
||||||
|
assertThat(convertedEnvironment.getConversionService())
|
||||||
|
.isEqualTo(conversionService);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void standardEnvironmentIsReturnedUnconverted() {
|
||||||
|
StandardEnvironment standardEnvironment = new StandardEnvironment();
|
||||||
|
StandardEnvironment convertedEnvironment = this.environmentConverter
|
||||||
|
.convertToStandardEnvironmentIfNecessary(standardEnvironment);
|
||||||
|
assertThat(convertedEnvironment).isSameAs(standardEnvironment);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void standardServletEnvironmentIsConverted() {
|
||||||
|
StandardServletEnvironment standardServletEnvironment = new StandardServletEnvironment();
|
||||||
|
StandardEnvironment convertedEnvironment = this.environmentConverter
|
||||||
|
.convertToStandardEnvironmentIfNecessary(standardServletEnvironment);
|
||||||
|
assertThat(convertedEnvironment).isNotSameAs(standardServletEnvironment);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
Loading…
Reference in New Issue