Merge pull request #9259 from Ethan Rubinson
* gh-9259: Polish "Copy conversion service when performing environment conversion" Copy conversion service when performing environment conversionpull/9426/merge
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);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -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