Delete deprecate relaxed binder code
Remove the deprecated relaxed binder code that has now been replaced with the configuration properties binder. Closes gh-9000
This commit is contained in:
		
							parent
							
								
									5edb1194f5
								
							
						
					
					
						commit
						4e3d280378
					
				| 
						 | 
				
			
			@ -1,119 +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
 | 
			
		||||
 */
 | 
			
		||||
@Deprecated
 | 
			
		||||
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,346 +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
 | 
			
		||||
 */
 | 
			
		||||
@Deprecated
 | 
			
		||||
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) {
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -1,92 +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
 | 
			
		||||
 */
 | 
			
		||||
@Deprecated
 | 
			
		||||
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,129 +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
 | 
			
		||||
 */
 | 
			
		||||
@Deprecated
 | 
			
		||||
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;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -30,7 +30,6 @@ import org.springframework.util.StringUtils;
 | 
			
		|||
 * @author Phillip Webb
 | 
			
		||||
 * @author Dave Syer
 | 
			
		||||
 * @see RelaxedDataBinder
 | 
			
		||||
 * @see RelaxedPropertyResolver
 | 
			
		||||
 */
 | 
			
		||||
@Deprecated
 | 
			
		||||
public final class RelaxedNames implements Iterable<String> {
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,156 +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.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
 | 
			
		||||
 */
 | 
			
		||||
@Deprecated
 | 
			
		||||
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,83 +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 org.junit.Test;
 | 
			
		||||
 | 
			
		||||
import static org.assertj.core.api.Assertions.assertThat;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Tests for {@link DefaultPropertyNamePatternsMatcher}.
 | 
			
		||||
 *
 | 
			
		||||
 * @author Phillip Webb
 | 
			
		||||
 */
 | 
			
		||||
public class DefaultPropertyNamePatternsMatcherTests {
 | 
			
		||||
 | 
			
		||||
	private static final char[] DELIMITERS = { '.', '_' };
 | 
			
		||||
 | 
			
		||||
	@Test
 | 
			
		||||
	public void namesShorter() {
 | 
			
		||||
		assertThat(new DefaultPropertyNamePatternsMatcher(DELIMITERS, "aaaa", "bbbb")
 | 
			
		||||
				.matches("zzzzz")).isFalse();
 | 
			
		||||
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	@Test
 | 
			
		||||
	public void namesExactMatch() {
 | 
			
		||||
		assertThat(
 | 
			
		||||
				new DefaultPropertyNamePatternsMatcher(DELIMITERS, "aaaa", "bbbb", "cccc")
 | 
			
		||||
						.matches("bbbb")).isTrue();
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	@Test
 | 
			
		||||
	public void namesLonger() {
 | 
			
		||||
		assertThat(new DefaultPropertyNamePatternsMatcher(DELIMITERS, "aaaaa", "bbbbb",
 | 
			
		||||
				"ccccc").matches("bbbb")).isFalse();
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	@Test
 | 
			
		||||
	public void nameWithDot() throws Exception {
 | 
			
		||||
		assertThat(
 | 
			
		||||
				new DefaultPropertyNamePatternsMatcher(DELIMITERS, "aaaa", "bbbb", "cccc")
 | 
			
		||||
						.matches("bbbb.anything")).isTrue();
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	@Test
 | 
			
		||||
	public void nameWithUnderscore() throws Exception {
 | 
			
		||||
		assertThat(
 | 
			
		||||
				new DefaultPropertyNamePatternsMatcher(DELIMITERS, "aaaa", "bbbb", "cccc")
 | 
			
		||||
						.matches("bbbb_anything")).isTrue();
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	@Test
 | 
			
		||||
	public void namesMatchWithDifferentLengths() throws Exception {
 | 
			
		||||
		assertThat(
 | 
			
		||||
				new DefaultPropertyNamePatternsMatcher(DELIMITERS, "aaa", "bbbb", "ccccc")
 | 
			
		||||
						.matches("bbbb")).isTrue();
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	@Test
 | 
			
		||||
	public void withSquareBrackets() throws Exception {
 | 
			
		||||
		char[] delimiters = "._[".toCharArray();
 | 
			
		||||
		PropertyNamePatternsMatcher matcher = new DefaultPropertyNamePatternsMatcher(
 | 
			
		||||
				delimiters, "aaa", "bbbb", "ccccc");
 | 
			
		||||
		assertThat(matcher.matches("bbbb")).isTrue();
 | 
			
		||||
		assertThat(matcher.matches("bbbb[4]")).isTrue();
 | 
			
		||||
		assertThat(matcher.matches("bbb[4]")).isFalse();
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -1,133 +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.io.IOException;
 | 
			
		||||
import java.util.Collections;
 | 
			
		||||
import java.util.HashMap;
 | 
			
		||||
import java.util.Map;
 | 
			
		||||
import java.util.Properties;
 | 
			
		||||
 | 
			
		||||
import org.junit.Test;
 | 
			
		||||
 | 
			
		||||
import org.springframework.context.support.StaticMessageSource;
 | 
			
		||||
import org.springframework.core.env.CompositePropertySource;
 | 
			
		||||
import org.springframework.core.env.MapPropertySource;
 | 
			
		||||
import org.springframework.core.env.MutablePropertySources;
 | 
			
		||||
import org.springframework.core.env.PropertiesPropertySource;
 | 
			
		||||
import org.springframework.core.io.ByteArrayResource;
 | 
			
		||||
import org.springframework.core.io.support.PropertiesLoaderUtils;
 | 
			
		||||
import org.springframework.validation.Validator;
 | 
			
		||||
 | 
			
		||||
import static org.assertj.core.api.Assertions.assertThat;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Tests for {@link PropertiesConfigurationFactory} binding to a map.
 | 
			
		||||
 *
 | 
			
		||||
 * @author Dave Syer
 | 
			
		||||
 */
 | 
			
		||||
public class PropertiesConfigurationFactoryMapTests {
 | 
			
		||||
 | 
			
		||||
	private PropertiesConfigurationFactory<Foo> factory;
 | 
			
		||||
 | 
			
		||||
	private Validator validator;
 | 
			
		||||
 | 
			
		||||
	private boolean ignoreUnknownFields = true;
 | 
			
		||||
 | 
			
		||||
	private String targetName = null;
 | 
			
		||||
 | 
			
		||||
	@Test
 | 
			
		||||
	public void testValidPropertiesLoadsWithNoErrors() throws Exception {
 | 
			
		||||
		Foo foo = createFoo("map.name: blah\nmap.bar: blah");
 | 
			
		||||
		assertThat(foo.map.get("bar")).isEqualTo("blah");
 | 
			
		||||
		assertThat(foo.map.get("name")).isEqualTo("blah");
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	@Test
 | 
			
		||||
	public void testBindToNamedTarget() throws Exception {
 | 
			
		||||
		this.targetName = "foo";
 | 
			
		||||
		Foo foo = createFoo("hi: hello\nfoo.map.name: foo\nfoo.map.bar: blah");
 | 
			
		||||
		assertThat(foo.map.get("bar")).isEqualTo("blah");
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	@Test
 | 
			
		||||
	public void testBindFromPropertySource() throws Exception {
 | 
			
		||||
		this.targetName = "foo";
 | 
			
		||||
		setupFactory();
 | 
			
		||||
		MutablePropertySources sources = new MutablePropertySources();
 | 
			
		||||
		sources.addFirst(new MapPropertySource("map",
 | 
			
		||||
				Collections.singletonMap("foo.map.name", (Object) "blah")));
 | 
			
		||||
		this.factory.setPropertySources(sources);
 | 
			
		||||
		this.factory.afterPropertiesSet();
 | 
			
		||||
		Foo foo = this.factory.getObject();
 | 
			
		||||
		assertThat(foo.map.get("name")).isEqualTo("blah");
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	@Test
 | 
			
		||||
	public void testBindFromCompositePropertySource() throws Exception {
 | 
			
		||||
		this.targetName = "foo";
 | 
			
		||||
		setupFactory();
 | 
			
		||||
		MutablePropertySources sources = new MutablePropertySources();
 | 
			
		||||
		CompositePropertySource composite = new CompositePropertySource("composite");
 | 
			
		||||
		composite.addPropertySource(new MapPropertySource("map",
 | 
			
		||||
				Collections.singletonMap("foo.map.name", (Object) "blah")));
 | 
			
		||||
		sources.addFirst(composite);
 | 
			
		||||
		this.factory.setPropertySources(sources);
 | 
			
		||||
		this.factory.afterPropertiesSet();
 | 
			
		||||
		Foo foo = this.factory.getObject();
 | 
			
		||||
		assertThat(foo.map.get("name")).isEqualTo("blah");
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	private Foo createFoo(final String values) throws Exception {
 | 
			
		||||
		setupFactory();
 | 
			
		||||
		return bindFoo(values);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	private Foo bindFoo(final String values) throws Exception {
 | 
			
		||||
		Properties properties = PropertiesLoaderUtils
 | 
			
		||||
				.loadProperties(new ByteArrayResource(values.getBytes()));
 | 
			
		||||
		MutablePropertySources propertySources = new MutablePropertySources();
 | 
			
		||||
		propertySources.addFirst(new PropertiesPropertySource("test", properties));
 | 
			
		||||
		this.factory.setPropertySources(propertySources);
 | 
			
		||||
		this.factory.afterPropertiesSet();
 | 
			
		||||
		return this.factory.getObject();
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	private void setupFactory() throws IOException {
 | 
			
		||||
		this.factory = new PropertiesConfigurationFactory<>(Foo.class);
 | 
			
		||||
		this.factory.setValidator(this.validator);
 | 
			
		||||
		this.factory.setTargetName(this.targetName);
 | 
			
		||||
		this.factory.setIgnoreUnknownFields(this.ignoreUnknownFields);
 | 
			
		||||
		this.factory.setMessageSource(new StaticMessageSource());
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// Foo needs to be public and to have setters for all properties
 | 
			
		||||
	public static class Foo {
 | 
			
		||||
 | 
			
		||||
		private Map<String, Object> map = new HashMap<>();
 | 
			
		||||
 | 
			
		||||
		public Map<String, Object> getMap() {
 | 
			
		||||
			return this.map;
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		public void setMap(Map<String, Object> map) {
 | 
			
		||||
			this.map = map;
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -1,162 +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.io.IOException;
 | 
			
		||||
import java.util.Properties;
 | 
			
		||||
 | 
			
		||||
import javax.validation.constraints.NotNull;
 | 
			
		||||
 | 
			
		||||
import org.junit.Test;
 | 
			
		||||
import org.junit.runner.RunWith;
 | 
			
		||||
import org.junit.runners.Parameterized;
 | 
			
		||||
import org.junit.runners.Parameterized.Parameters;
 | 
			
		||||
 | 
			
		||||
import org.springframework.context.support.StaticMessageSource;
 | 
			
		||||
import org.springframework.core.env.MutablePropertySources;
 | 
			
		||||
import org.springframework.core.env.PropertiesPropertySource;
 | 
			
		||||
import org.springframework.core.io.ByteArrayResource;
 | 
			
		||||
import org.springframework.core.io.support.PropertiesLoaderUtils;
 | 
			
		||||
 | 
			
		||||
import static org.assertj.core.api.Assertions.assertThat;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Parameterized tests for {@link PropertiesConfigurationFactory}
 | 
			
		||||
 *
 | 
			
		||||
 * @author Dave Syer
 | 
			
		||||
 * @author Andy Wilkinson
 | 
			
		||||
 */
 | 
			
		||||
@RunWith(Parameterized.class)
 | 
			
		||||
public class PropertiesConfigurationFactoryParameterizedTests {
 | 
			
		||||
 | 
			
		||||
	private String targetName;
 | 
			
		||||
 | 
			
		||||
	private PropertiesConfigurationFactory<Foo> factory = new PropertiesConfigurationFactory<>(
 | 
			
		||||
			Foo.class);
 | 
			
		||||
 | 
			
		||||
	@Parameters
 | 
			
		||||
	public static Object[] parameters() {
 | 
			
		||||
		return new Object[] { new Object[] { false }, new Object[] { true } };
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	public PropertiesConfigurationFactoryParameterizedTests(boolean ignoreUnknownFields) {
 | 
			
		||||
		this.factory.setIgnoreUnknownFields(ignoreUnknownFields);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	@Test
 | 
			
		||||
	public void testValidPropertiesLoadsWithNoErrors() throws Exception {
 | 
			
		||||
		Foo foo = createFoo("name: blah\nbar: blah");
 | 
			
		||||
		assertThat(foo.bar).isEqualTo("blah");
 | 
			
		||||
		assertThat(foo.name).isEqualTo("blah");
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	@Test
 | 
			
		||||
	public void testValidPropertiesLoadsWithUpperCase() throws Exception {
 | 
			
		||||
		Foo foo = createFoo("NAME: blah\nbar: blah");
 | 
			
		||||
		assertThat(foo.bar).isEqualTo("blah");
 | 
			
		||||
		assertThat(foo.name).isEqualTo("blah");
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	@Test
 | 
			
		||||
	public void testUnderscore() throws Exception {
 | 
			
		||||
		Foo foo = createFoo("spring_foo_baz: blah\nname: blah");
 | 
			
		||||
		assertThat(foo.spring_foo_baz).isEqualTo("blah");
 | 
			
		||||
		assertThat(foo.name).isEqualTo("blah");
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	@Test
 | 
			
		||||
	public void testBindToNamedTarget() throws Exception {
 | 
			
		||||
		this.targetName = "foo";
 | 
			
		||||
		Foo foo = createFoo("hi: hello\nfoo.name: foo\nfoo.bar: blah");
 | 
			
		||||
		assertThat(foo.bar).isEqualTo("blah");
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	@Test
 | 
			
		||||
	public void testBindToNamedTargetUppercaseUnderscores() throws Exception {
 | 
			
		||||
		this.targetName = "foo";
 | 
			
		||||
		Foo foo = createFoo("FOO_NAME: foo\nFOO_BAR: blah");
 | 
			
		||||
		assertThat(foo.bar).isEqualTo("blah");
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	private Foo createFoo(final String values) throws Exception {
 | 
			
		||||
		setupFactory();
 | 
			
		||||
		return bindFoo(values);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	private Foo bindFoo(final String values) throws Exception {
 | 
			
		||||
		Properties properties = PropertiesLoaderUtils
 | 
			
		||||
				.loadProperties(new ByteArrayResource(values.getBytes()));
 | 
			
		||||
		MutablePropertySources propertySources = new MutablePropertySources();
 | 
			
		||||
		propertySources.addFirst(new PropertiesPropertySource("test", properties));
 | 
			
		||||
		this.factory.setPropertySources(propertySources);
 | 
			
		||||
 | 
			
		||||
		this.factory.afterPropertiesSet();
 | 
			
		||||
		return this.factory.getObject();
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	private void setupFactory() throws IOException {
 | 
			
		||||
		this.factory.setTargetName(this.targetName);
 | 
			
		||||
		this.factory.setMessageSource(new StaticMessageSource());
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// Foo needs to be public and to have setters for all properties
 | 
			
		||||
	public static class Foo {
 | 
			
		||||
 | 
			
		||||
		@NotNull
 | 
			
		||||
		private String name;
 | 
			
		||||
 | 
			
		||||
		private String bar;
 | 
			
		||||
 | 
			
		||||
		private String spring_foo_baz;
 | 
			
		||||
 | 
			
		||||
		private String fooBar;
 | 
			
		||||
 | 
			
		||||
		public String getSpringFooBaz() {
 | 
			
		||||
			return this.spring_foo_baz;
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		public void setSpringFooBaz(String spring_foo_baz) {
 | 
			
		||||
			this.spring_foo_baz = spring_foo_baz;
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		public String getName() {
 | 
			
		||||
			return this.name;
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		public void setName(String name) {
 | 
			
		||||
			this.name = name;
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		public String getBar() {
 | 
			
		||||
			return this.bar;
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		public void setBar(String bar) {
 | 
			
		||||
			this.bar = bar;
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		public String getFooBar() {
 | 
			
		||||
			return this.fooBar;
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		public void setFooBar(String fooBar) {
 | 
			
		||||
			this.fooBar = fooBar;
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -1,111 +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.io.IOException;
 | 
			
		||||
 | 
			
		||||
import javax.validation.constraints.NotNull;
 | 
			
		||||
 | 
			
		||||
import org.junit.BeforeClass;
 | 
			
		||||
import org.junit.experimental.theories.DataPoints;
 | 
			
		||||
import org.junit.experimental.theories.Theories;
 | 
			
		||||
import org.junit.experimental.theories.Theory;
 | 
			
		||||
import org.junit.runner.RunWith;
 | 
			
		||||
 | 
			
		||||
import org.springframework.context.support.StaticMessageSource;
 | 
			
		||||
import org.springframework.core.env.StandardEnvironment;
 | 
			
		||||
import org.springframework.test.context.support.TestPropertySourceUtils;
 | 
			
		||||
import org.springframework.validation.Validator;
 | 
			
		||||
 | 
			
		||||
import static org.assertj.core.api.Assertions.assertThat;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Performance tests for {@link PropertiesConfigurationFactory}.
 | 
			
		||||
 *
 | 
			
		||||
 * @author Dave Syer
 | 
			
		||||
 */
 | 
			
		||||
@RunWith(Theories.class)
 | 
			
		||||
public class PropertiesConfigurationFactoryPerformanceTests {
 | 
			
		||||
 | 
			
		||||
	@DataPoints
 | 
			
		||||
	public static String[] values = new String[1000];
 | 
			
		||||
 | 
			
		||||
	private PropertiesConfigurationFactory<Foo> factory;
 | 
			
		||||
 | 
			
		||||
	private Validator validator;
 | 
			
		||||
 | 
			
		||||
	private boolean ignoreUnknownFields = true;
 | 
			
		||||
 | 
			
		||||
	private String targetName = null;
 | 
			
		||||
 | 
			
		||||
	private static StandardEnvironment environment = new StandardEnvironment();
 | 
			
		||||
 | 
			
		||||
	@BeforeClass
 | 
			
		||||
	public static void init() {
 | 
			
		||||
		TestPropertySourceUtils.addInlinedPropertiesToEnvironment(environment,
 | 
			
		||||
				"name=blah", "bar=blah");
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	@Theory
 | 
			
		||||
	public void testValidProperties(String value) throws Exception {
 | 
			
		||||
		Foo foo = createFoo();
 | 
			
		||||
		assertThat(foo.bar).isEqualTo("blah");
 | 
			
		||||
		assertThat(foo.name).isEqualTo("blah");
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	private Foo createFoo() throws Exception {
 | 
			
		||||
		setupFactory();
 | 
			
		||||
		this.factory.setPropertySources(environment.getPropertySources());
 | 
			
		||||
		this.factory.afterPropertiesSet();
 | 
			
		||||
		return this.factory.getObject();
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	private void setupFactory() throws IOException {
 | 
			
		||||
		this.factory = new PropertiesConfigurationFactory<>(Foo.class);
 | 
			
		||||
		this.factory.setValidator(this.validator);
 | 
			
		||||
		this.factory.setTargetName(this.targetName);
 | 
			
		||||
		this.factory.setIgnoreUnknownFields(this.ignoreUnknownFields);
 | 
			
		||||
		this.factory.setMessageSource(new StaticMessageSource());
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// Foo needs to be public and to have setters for all properties
 | 
			
		||||
	public static class Foo {
 | 
			
		||||
 | 
			
		||||
		@NotNull
 | 
			
		||||
		private String name;
 | 
			
		||||
 | 
			
		||||
		private String bar;
 | 
			
		||||
 | 
			
		||||
		public String getName() {
 | 
			
		||||
			return this.name;
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		public void setName(String name) {
 | 
			
		||||
			this.name = name;
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		public String getBar() {
 | 
			
		||||
			return this.bar;
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		public void setBar(String bar) {
 | 
			
		||||
			this.bar = bar;
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -1,291 +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.io.IOException;
 | 
			
		||||
import java.util.Collections;
 | 
			
		||||
import java.util.Properties;
 | 
			
		||||
 | 
			
		||||
import javax.validation.Validation;
 | 
			
		||||
import javax.validation.constraints.NotNull;
 | 
			
		||||
 | 
			
		||||
import org.junit.Test;
 | 
			
		||||
 | 
			
		||||
import org.springframework.beans.NotWritablePropertyException;
 | 
			
		||||
import org.springframework.boot.env.RandomValuePropertySource;
 | 
			
		||||
import org.springframework.context.support.StaticMessageSource;
 | 
			
		||||
import org.springframework.core.env.MutablePropertySources;
 | 
			
		||||
import org.springframework.core.env.PropertiesPropertySource;
 | 
			
		||||
import org.springframework.core.env.StandardEnvironment;
 | 
			
		||||
import org.springframework.core.env.SystemEnvironmentPropertySource;
 | 
			
		||||
import org.springframework.core.io.ByteArrayResource;
 | 
			
		||||
import org.springframework.core.io.support.PropertiesLoaderUtils;
 | 
			
		||||
import org.springframework.mock.env.MockPropertySource;
 | 
			
		||||
import org.springframework.validation.BindException;
 | 
			
		||||
import org.springframework.validation.Validator;
 | 
			
		||||
import org.springframework.validation.beanvalidation.SpringValidatorAdapter;
 | 
			
		||||
 | 
			
		||||
import static org.assertj.core.api.Assertions.assertThat;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Tests for {@link PropertiesConfigurationFactory}.
 | 
			
		||||
 *
 | 
			
		||||
 * @author Dave Syer
 | 
			
		||||
 */
 | 
			
		||||
public class PropertiesConfigurationFactoryTests {
 | 
			
		||||
 | 
			
		||||
	private PropertiesConfigurationFactory<Foo> factory;
 | 
			
		||||
 | 
			
		||||
	private Validator validator;
 | 
			
		||||
 | 
			
		||||
	private boolean ignoreUnknownFields = true;
 | 
			
		||||
 | 
			
		||||
	private String targetName = null;
 | 
			
		||||
 | 
			
		||||
	@Test
 | 
			
		||||
	public void testValidPropertiesLoadsWithDash() throws Exception {
 | 
			
		||||
		this.ignoreUnknownFields = false;
 | 
			
		||||
		Foo foo = createFoo("na-me: blah\nbar: blah");
 | 
			
		||||
		assertThat(foo.bar).isEqualTo("blah");
 | 
			
		||||
		assertThat(foo.name).isEqualTo("blah");
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	@Test
 | 
			
		||||
	public void testUnknownPropertyOkByDefault() throws Exception {
 | 
			
		||||
		Foo foo = createFoo("hi: hello\nname: foo\nbar: blah");
 | 
			
		||||
		assertThat(foo.bar).isEqualTo("blah");
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	@Test(expected = NotWritablePropertyException.class)
 | 
			
		||||
	public void testUnknownPropertyCausesLoadFailure() throws Exception {
 | 
			
		||||
		this.ignoreUnknownFields = false;
 | 
			
		||||
		createFoo("hi: hello\nname: foo\nbar: blah");
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	@Test(expected = BindException.class)
 | 
			
		||||
	public void testMissingPropertyCausesValidationError() throws Exception {
 | 
			
		||||
		this.validator = new SpringValidatorAdapter(
 | 
			
		||||
				Validation.buildDefaultValidatorFactory().getValidator());
 | 
			
		||||
		createFoo("bar: blah");
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	@Test
 | 
			
		||||
	public void systemEnvironmentBindingFailuresAreIgnored() throws Exception {
 | 
			
		||||
		setupFactory();
 | 
			
		||||
		MutablePropertySources propertySources = new MutablePropertySources();
 | 
			
		||||
		MockPropertySource propertySource = new MockPropertySource(
 | 
			
		||||
				StandardEnvironment.SYSTEM_ENVIRONMENT_PROPERTY_SOURCE_NAME);
 | 
			
		||||
		propertySource.setProperty("doesNotExist", "foo");
 | 
			
		||||
		propertySource.setProperty("name", "bar");
 | 
			
		||||
		propertySources.addFirst(propertySource);
 | 
			
		||||
		this.factory.setPropertySources(propertySources);
 | 
			
		||||
		this.factory.setIgnoreUnknownFields(false);
 | 
			
		||||
		this.factory.afterPropertiesSet();
 | 
			
		||||
		Foo foo = this.factory.getObject();
 | 
			
		||||
		assertThat(foo.name).isEqualTo("bar");
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	@Test
 | 
			
		||||
	public void systemEnvironmentBindingWithDefaults() throws Exception {
 | 
			
		||||
		setupFactory();
 | 
			
		||||
		MutablePropertySources propertySources = new MutablePropertySources();
 | 
			
		||||
		MockPropertySource propertySource = new MockPropertySource(
 | 
			
		||||
				StandardEnvironment.SYSTEM_ENVIRONMENT_PROPERTY_SOURCE_NAME);
 | 
			
		||||
		propertySource.setProperty("name", "${foo.name:bar}");
 | 
			
		||||
		propertySources.addFirst(propertySource);
 | 
			
		||||
		this.factory.setPropertySources(propertySources);
 | 
			
		||||
		this.factory.afterPropertiesSet();
 | 
			
		||||
		Foo foo = this.factory.getObject();
 | 
			
		||||
		assertThat(foo.name).isEqualTo("bar");
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	@Test
 | 
			
		||||
	public void systemEnvironmentNoResolvePlaceholders() throws Exception {
 | 
			
		||||
		setupFactory();
 | 
			
		||||
		MutablePropertySources propertySources = new MutablePropertySources();
 | 
			
		||||
		MockPropertySource propertySource = new MockPropertySource(
 | 
			
		||||
				StandardEnvironment.SYSTEM_ENVIRONMENT_PROPERTY_SOURCE_NAME);
 | 
			
		||||
		propertySource.setProperty("name", "${foo.name:bar}");
 | 
			
		||||
		propertySources.addFirst(propertySource);
 | 
			
		||||
		this.factory.setPropertySources(propertySources);
 | 
			
		||||
		this.factory.setResolvePlaceholders(false);
 | 
			
		||||
		this.factory.afterPropertiesSet();
 | 
			
		||||
		Foo foo = this.factory.getObject();
 | 
			
		||||
		assertThat(foo.name).isEqualTo("${foo.name:bar}");
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	@Test
 | 
			
		||||
	public void systemPropertyBindingFailuresAreIgnored() throws Exception {
 | 
			
		||||
		setupFactory();
 | 
			
		||||
		MutablePropertySources propertySources = new MutablePropertySources();
 | 
			
		||||
		MockPropertySource propertySource = new MockPropertySource(
 | 
			
		||||
				StandardEnvironment.SYSTEM_PROPERTIES_PROPERTY_SOURCE_NAME);
 | 
			
		||||
		propertySource.setProperty("doesNotExist", "foo");
 | 
			
		||||
		propertySource.setProperty("name", "bar");
 | 
			
		||||
		propertySources.addFirst(propertySource);
 | 
			
		||||
		this.factory.setPropertySources(propertySources);
 | 
			
		||||
		this.factory.setIgnoreUnknownFields(false);
 | 
			
		||||
		this.factory.afterPropertiesSet();
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	@Test
 | 
			
		||||
	public void testBindWithDashPrefix() throws Exception {
 | 
			
		||||
		// gh-4045
 | 
			
		||||
		this.targetName = "foo-bar";
 | 
			
		||||
		MutablePropertySources propertySources = new MutablePropertySources();
 | 
			
		||||
		propertySources.addLast(new SystemEnvironmentPropertySource("systemEnvironment",
 | 
			
		||||
				Collections.<String, Object>singletonMap("FOO_BAR_NAME", "blah")));
 | 
			
		||||
		propertySources.addLast(new RandomValuePropertySource());
 | 
			
		||||
		setupFactory();
 | 
			
		||||
		this.factory.setPropertySources(propertySources);
 | 
			
		||||
		this.factory.afterPropertiesSet();
 | 
			
		||||
		Foo foo = this.factory.getObject();
 | 
			
		||||
		assertThat(foo.name).isEqualTo("blah");
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	@Test
 | 
			
		||||
	public void testBindWithDelimitedPrefixUsingMatchingDelimiter() throws Exception {
 | 
			
		||||
		this.targetName = "env_foo";
 | 
			
		||||
		this.ignoreUnknownFields = false;
 | 
			
		||||
		MutablePropertySources propertySources = new MutablePropertySources();
 | 
			
		||||
		propertySources.addLast(new SystemEnvironmentPropertySource("systemEnvironment",
 | 
			
		||||
				Collections.<String, Object>singletonMap("ENV_FOO_NAME", "blah")));
 | 
			
		||||
		propertySources.addLast(new RandomValuePropertySource("random"));
 | 
			
		||||
		setupFactory();
 | 
			
		||||
		this.factory.setPropertySources(propertySources);
 | 
			
		||||
		this.factory.afterPropertiesSet();
 | 
			
		||||
		Foo foo = this.factory.getObject();
 | 
			
		||||
		assertThat(foo.name).isEqualTo("blah");
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	@Test
 | 
			
		||||
	public void testBindWithDelimitedPrefixUsingDifferentDelimiter() throws Exception {
 | 
			
		||||
		this.targetName = "env.foo";
 | 
			
		||||
		MutablePropertySources propertySources = new MutablePropertySources();
 | 
			
		||||
		propertySources.addLast(new SystemEnvironmentPropertySource("systemEnvironment",
 | 
			
		||||
				Collections.<String, Object>singletonMap("ENV_FOO_NAME", "blah")));
 | 
			
		||||
		propertySources.addLast(new RandomValuePropertySource("random"));
 | 
			
		||||
		this.ignoreUnknownFields = false;
 | 
			
		||||
		setupFactory();
 | 
			
		||||
		this.factory.setPropertySources(propertySources);
 | 
			
		||||
		this.factory.afterPropertiesSet();
 | 
			
		||||
		Foo foo = this.factory.getObject();
 | 
			
		||||
		assertThat(foo.name).isEqualTo("blah");
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	@Test
 | 
			
		||||
	public void propertyWithAllUpperCaseSuffixCanBeBound() throws Exception {
 | 
			
		||||
		Foo foo = createFoo("foo-bar-u-r-i:baz");
 | 
			
		||||
		assertThat(foo.fooBarURI).isEqualTo("baz");
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	@Test
 | 
			
		||||
	public void propertyWithAllUpperCaseInTheMiddleCanBeBound() throws Exception {
 | 
			
		||||
		Foo foo = createFoo("foo-d-l-q-bar:baz");
 | 
			
		||||
		assertThat(foo.fooDLQBar).isEqualTo(("baz"));
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	private Foo createFoo(final String values) throws Exception {
 | 
			
		||||
		setupFactory();
 | 
			
		||||
		return bindFoo(values);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	private Foo bindFoo(final String values) throws Exception {
 | 
			
		||||
		Properties properties = PropertiesLoaderUtils
 | 
			
		||||
				.loadProperties(new ByteArrayResource(values.getBytes()));
 | 
			
		||||
		MutablePropertySources propertySources = new MutablePropertySources();
 | 
			
		||||
		propertySources.addFirst(new PropertiesPropertySource("test", properties));
 | 
			
		||||
		this.factory.setPropertySources(propertySources);
 | 
			
		||||
		this.factory.afterPropertiesSet();
 | 
			
		||||
		return this.factory.getObject();
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	private void setupFactory() throws IOException {
 | 
			
		||||
		this.factory = new PropertiesConfigurationFactory<>(Foo.class);
 | 
			
		||||
		this.factory.setValidator(this.validator);
 | 
			
		||||
		this.factory.setTargetName(this.targetName);
 | 
			
		||||
		this.factory.setIgnoreUnknownFields(this.ignoreUnknownFields);
 | 
			
		||||
		this.factory.setMessageSource(new StaticMessageSource());
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// Foo needs to be public and to have setters for all properties
 | 
			
		||||
	public static class Foo {
 | 
			
		||||
 | 
			
		||||
		@NotNull
 | 
			
		||||
		private String name;
 | 
			
		||||
 | 
			
		||||
		private String bar;
 | 
			
		||||
 | 
			
		||||
		private String spring_foo_baz;
 | 
			
		||||
 | 
			
		||||
		private String fooBar;
 | 
			
		||||
 | 
			
		||||
		private String fooBarURI;
 | 
			
		||||
 | 
			
		||||
		private String fooDLQBar;
 | 
			
		||||
 | 
			
		||||
		public String getSpringFooBaz() {
 | 
			
		||||
			return this.spring_foo_baz;
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		public void setSpringFooBaz(String spring_foo_baz) {
 | 
			
		||||
			this.spring_foo_baz = spring_foo_baz;
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		public String getName() {
 | 
			
		||||
			return this.name;
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		public void setName(String name) {
 | 
			
		||||
			this.name = name;
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		public String getBar() {
 | 
			
		||||
			return this.bar;
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		public void setBar(String bar) {
 | 
			
		||||
			this.bar = bar;
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		public String getFooBar() {
 | 
			
		||||
			return this.fooBar;
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		public void setFooBar(String fooBar) {
 | 
			
		||||
			this.fooBar = fooBar;
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		public String getFooBarURI() {
 | 
			
		||||
			return this.fooBarURI;
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		public void setFooBarURI(String fooBarURI) {
 | 
			
		||||
			this.fooBarURI = fooBarURI;
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		public String getFooDLQBar() {
 | 
			
		||||
			return this.fooDLQBar;
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		public void setFooDLQBar(String fooDLQBar) {
 | 
			
		||||
			this.fooDLQBar = fooDLQBar;
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -1,99 +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.junit.Test;
 | 
			
		||||
 | 
			
		||||
import org.springframework.core.env.StandardEnvironment;
 | 
			
		||||
import org.springframework.test.context.support.TestPropertySourceUtils;
 | 
			
		||||
 | 
			
		||||
import static org.assertj.core.api.Assertions.assertThat;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Tests for {@link PropertySourcesBinder}.
 | 
			
		||||
 *
 | 
			
		||||
 * @author Stephane Nicoll
 | 
			
		||||
 */
 | 
			
		||||
public class PropertySourcesBinderTests {
 | 
			
		||||
 | 
			
		||||
	private StandardEnvironment env = new StandardEnvironment();
 | 
			
		||||
 | 
			
		||||
	@Test
 | 
			
		||||
	public void extractAllWithPrefix() {
 | 
			
		||||
		TestPropertySourceUtils.addInlinedPropertiesToEnvironment(this.env, "foo.first=1",
 | 
			
		||||
				"foo.second=2");
 | 
			
		||||
		Map<String, Object> content = new PropertySourcesBinder(this.env)
 | 
			
		||||
				.extractAll("foo");
 | 
			
		||||
		assertThat(content.get("first")).isEqualTo("1");
 | 
			
		||||
		assertThat(content.get("second")).isEqualTo("2");
 | 
			
		||||
		assertThat(content).hasSize(2);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	@Test
 | 
			
		||||
	@SuppressWarnings("unchecked")
 | 
			
		||||
	public void extractNoPrefix() {
 | 
			
		||||
		TestPropertySourceUtils.addInlinedPropertiesToEnvironment(this.env,
 | 
			
		||||
				"foo.ctx.first=1", "foo.ctx.second=2");
 | 
			
		||||
		Map<String, Object> content = new PropertySourcesBinder(this.env).extractAll("");
 | 
			
		||||
		assertThat(content.get("foo")).isInstanceOf(Map.class);
 | 
			
		||||
		Map<String, Object> foo = (Map<String, Object>) content.get("foo");
 | 
			
		||||
		assertThat(content.get("foo")).isInstanceOf(Map.class);
 | 
			
		||||
		Map<String, Object> ctx = (Map<String, Object>) foo.get("ctx");
 | 
			
		||||
		assertThat(ctx.get("first")).isEqualTo("1");
 | 
			
		||||
		assertThat(ctx.get("second")).isEqualTo("2");
 | 
			
		||||
		assertThat(ctx).hasSize(2);
 | 
			
		||||
		assertThat(foo).hasSize(1);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	@Test
 | 
			
		||||
	public void bindToSimplePojo() {
 | 
			
		||||
		TestPropertySourceUtils.addInlinedPropertiesToEnvironment(this.env,
 | 
			
		||||
				"test.name=foo", "test.counter=42");
 | 
			
		||||
		TestBean bean = new TestBean();
 | 
			
		||||
		new PropertySourcesBinder(this.env).bindTo("test", bean);
 | 
			
		||||
		assertThat(bean.getName()).isEqualTo("foo");
 | 
			
		||||
		assertThat(bean.getCounter()).isEqualTo(42);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	@SuppressWarnings("unused")
 | 
			
		||||
	private static class TestBean {
 | 
			
		||||
 | 
			
		||||
		private String name;
 | 
			
		||||
 | 
			
		||||
		private Integer counter;
 | 
			
		||||
 | 
			
		||||
		public String getName() {
 | 
			
		||||
			return this.name;
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		public void setName(String name) {
 | 
			
		||||
			this.name = name;
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		public Integer getCounter() {
 | 
			
		||||
			return this.counter;
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		public void setCounter(Integer counter) {
 | 
			
		||||
			this.counter = counter;
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -1,147 +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 org.junit.Test;
 | 
			
		||||
import org.junit.runner.RunWith;
 | 
			
		||||
 | 
			
		||||
import org.springframework.beans.factory.annotation.Autowired;
 | 
			
		||||
import org.springframework.beans.factory.annotation.Value;
 | 
			
		||||
import org.springframework.boot.bind.PropertySourcesBindingTests.TestConfig;
 | 
			
		||||
import org.springframework.boot.context.properties.ConfigurationProperties;
 | 
			
		||||
import org.springframework.boot.context.properties.EnableConfigurationProperties;
 | 
			
		||||
import org.springframework.context.annotation.Bean;
 | 
			
		||||
import org.springframework.context.annotation.Configuration;
 | 
			
		||||
import org.springframework.context.annotation.Import;
 | 
			
		||||
import org.springframework.context.annotation.PropertySource;
 | 
			
		||||
import org.springframework.context.annotation.PropertySources;
 | 
			
		||||
import org.springframework.context.support.PropertySourcesPlaceholderConfigurer;
 | 
			
		||||
import org.springframework.test.annotation.DirtiesContext;
 | 
			
		||||
import org.springframework.test.context.ContextConfiguration;
 | 
			
		||||
import org.springframework.test.context.junit4.SpringRunner;
 | 
			
		||||
 | 
			
		||||
import static org.assertj.core.api.Assertions.assertThat;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Tests for {@link PropertySourcesPropertyValues} binding.
 | 
			
		||||
 *
 | 
			
		||||
 * @author Dave Syer
 | 
			
		||||
 */
 | 
			
		||||
@RunWith(SpringRunner.class)
 | 
			
		||||
@DirtiesContext
 | 
			
		||||
@ContextConfiguration(classes = TestConfig.class, loader = SpringApplicationBindContextLoader.class)
 | 
			
		||||
public class PropertySourcesBindingTests {
 | 
			
		||||
 | 
			
		||||
	@Value("${foo:}")
 | 
			
		||||
	private String foo;
 | 
			
		||||
 | 
			
		||||
	@Autowired
 | 
			
		||||
	private Wrapper properties;
 | 
			
		||||
 | 
			
		||||
	@Test
 | 
			
		||||
	public void overridingOfPropertiesOrderOfAtPropertySources() {
 | 
			
		||||
		assertThat(this.properties.getBar()).isEqualTo("override");
 | 
			
		||||
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	@Test
 | 
			
		||||
	public void overridingOfPropertiesOrderOfAtPropertySourcesWherePropertyIsCapitalized() {
 | 
			
		||||
		assertThat(this.properties.getSpam()).isEqualTo("BUCKET");
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	@Test
 | 
			
		||||
	public void overridingOfPropertiesOrderOfAtPropertySourcesWherePropertyNamesDiffer() {
 | 
			
		||||
		assertThat(this.properties.getTheName()).isEqualTo("NAME");
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	@Test
 | 
			
		||||
	public void overridingOfPropertiesAndBindToAtValue() {
 | 
			
		||||
		assertThat(this.foo).isEqualTo(this.properties.getFoo());
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	@Test
 | 
			
		||||
	public void overridingOfPropertiesOrderOfApplicationProperties() {
 | 
			
		||||
		assertThat(this.properties.getFoo()).isEqualTo("bucket");
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	@Import({ SomeConfig.class })
 | 
			
		||||
	@PropertySources({ @PropertySource("classpath:/some.properties"),
 | 
			
		||||
			@PropertySource("classpath:/override.properties") })
 | 
			
		||||
	@Configuration
 | 
			
		||||
	@EnableConfigurationProperties(Wrapper.class)
 | 
			
		||||
	public static class TestConfig {
 | 
			
		||||
 | 
			
		||||
		@Bean
 | 
			
		||||
		public static PropertySourcesPlaceholderConfigurer propertySourcesPlaceholderConfigurer() {
 | 
			
		||||
			return new PropertySourcesPlaceholderConfigurer();
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	@Configuration
 | 
			
		||||
	@PropertySources({ @PropertySource("classpath:/override.properties"),
 | 
			
		||||
			@PropertySource("classpath:/some.properties") })
 | 
			
		||||
	public static class SomeConfig {
 | 
			
		||||
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	@ConfigurationProperties
 | 
			
		||||
	public static class Wrapper {
 | 
			
		||||
 | 
			
		||||
		private String foo;
 | 
			
		||||
 | 
			
		||||
		private String bar;
 | 
			
		||||
 | 
			
		||||
		private String spam;
 | 
			
		||||
 | 
			
		||||
		private String theName;
 | 
			
		||||
 | 
			
		||||
		public String getBar() {
 | 
			
		||||
			return this.bar;
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		public void setBar(String bar) {
 | 
			
		||||
			this.bar = bar;
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		public String getFoo() {
 | 
			
		||||
			return this.foo;
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		public void setFoo(String foo) {
 | 
			
		||||
			this.foo = foo;
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		public String getSpam() {
 | 
			
		||||
			return this.spam;
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		public void setSpam(String spam) {
 | 
			
		||||
			this.spam = spam;
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		public String getTheName() {
 | 
			
		||||
			return this.theName;
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		public void setTheName(String theName) {
 | 
			
		||||
			this.theName = theName;
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -1,312 +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.ArrayList;
 | 
			
		||||
import java.util.Collection;
 | 
			
		||||
import java.util.Collections;
 | 
			
		||||
import java.util.LinkedHashMap;
 | 
			
		||||
import java.util.List;
 | 
			
		||||
import java.util.Map;
 | 
			
		||||
 | 
			
		||||
import org.junit.Before;
 | 
			
		||||
import org.junit.Test;
 | 
			
		||||
 | 
			
		||||
import org.springframework.beans.PropertyValue;
 | 
			
		||||
import org.springframework.core.env.CompositePropertySource;
 | 
			
		||||
import org.springframework.core.env.MapPropertySource;
 | 
			
		||||
import org.springframework.core.env.MutablePropertySources;
 | 
			
		||||
import org.springframework.core.env.PropertySource;
 | 
			
		||||
import org.springframework.validation.DataBinder;
 | 
			
		||||
 | 
			
		||||
import static org.assertj.core.api.Assertions.assertThat;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Tests for {@link PropertySourcesPropertyValues}.
 | 
			
		||||
 *
 | 
			
		||||
 * @author Dave Syer
 | 
			
		||||
 * @author Phillip Webb
 | 
			
		||||
 * @author Stephane Nicoll
 | 
			
		||||
 */
 | 
			
		||||
public class PropertySourcesPropertyValuesTests {
 | 
			
		||||
 | 
			
		||||
	private final MutablePropertySources propertySources = new MutablePropertySources();
 | 
			
		||||
 | 
			
		||||
	@Before
 | 
			
		||||
	public void init() {
 | 
			
		||||
		this.propertySources.addFirst(new PropertySource<String>("static", "foo") {
 | 
			
		||||
 | 
			
		||||
			@Override
 | 
			
		||||
			public Object getProperty(String name) {
 | 
			
		||||
				if (name.equals(getSource())) {
 | 
			
		||||
					return "bar";
 | 
			
		||||
				}
 | 
			
		||||
				return null;
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
		});
 | 
			
		||||
		this.propertySources.addFirst(new MapPropertySource("map",
 | 
			
		||||
				Collections.<String, Object>singletonMap("name", "${foo}")));
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	@Test
 | 
			
		||||
	public void testTypesPreserved() {
 | 
			
		||||
		Map<String, Object> map = Collections.<String, Object>singletonMap("name", 123);
 | 
			
		||||
		this.propertySources.replace("map", new MapPropertySource("map", map));
 | 
			
		||||
		PropertySourcesPropertyValues propertyValues = new PropertySourcesPropertyValues(
 | 
			
		||||
				this.propertySources);
 | 
			
		||||
		assertThat(propertyValues.getPropertyValues()[0].getValue()).isEqualTo(123);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	@Test
 | 
			
		||||
	public void testSize() {
 | 
			
		||||
		PropertySourcesPropertyValues propertyValues = new PropertySourcesPropertyValues(
 | 
			
		||||
				this.propertySources);
 | 
			
		||||
		assertThat(propertyValues.getPropertyValues().length).isEqualTo(1);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	@Test
 | 
			
		||||
	public void testOrderPreserved() {
 | 
			
		||||
		LinkedHashMap<String, Object> map = new LinkedHashMap<>();
 | 
			
		||||
		map.put("one", 1);
 | 
			
		||||
		map.put("two", 2);
 | 
			
		||||
		map.put("three", 3);
 | 
			
		||||
		map.put("four", 4);
 | 
			
		||||
		map.put("five", 5);
 | 
			
		||||
		this.propertySources.addFirst(new MapPropertySource("ordered", map));
 | 
			
		||||
		PropertySourcesPropertyValues propertyValues = new PropertySourcesPropertyValues(
 | 
			
		||||
				this.propertySources);
 | 
			
		||||
		PropertyValue[] values = propertyValues.getPropertyValues();
 | 
			
		||||
		assertThat(values).hasSize(6);
 | 
			
		||||
		Collection<String> names = new ArrayList<>();
 | 
			
		||||
		for (PropertyValue value : values) {
 | 
			
		||||
			names.add(value.getName());
 | 
			
		||||
		}
 | 
			
		||||
		assertThat(names).containsExactly("one", "two", "three", "four", "five", "name");
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	@Test
 | 
			
		||||
	public void testNonEnumeratedValue() {
 | 
			
		||||
		PropertySourcesPropertyValues propertyValues = new PropertySourcesPropertyValues(
 | 
			
		||||
				this.propertySources);
 | 
			
		||||
		assertThat(propertyValues.getPropertyValue("foo").getValue()).isEqualTo("bar");
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	@Test
 | 
			
		||||
	public void testCompositeValue() {
 | 
			
		||||
		PropertySource<?> map = this.propertySources.get("map");
 | 
			
		||||
		CompositePropertySource composite = new CompositePropertySource("composite");
 | 
			
		||||
		composite.addPropertySource(map);
 | 
			
		||||
		this.propertySources.replace("map", composite);
 | 
			
		||||
		PropertySourcesPropertyValues propertyValues = new PropertySourcesPropertyValues(
 | 
			
		||||
				this.propertySources);
 | 
			
		||||
		assertThat(propertyValues.getPropertyValue("foo").getValue()).isEqualTo("bar");
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	@Test
 | 
			
		||||
	public void testEnumeratedValue() {
 | 
			
		||||
		PropertySourcesPropertyValues propertyValues = new PropertySourcesPropertyValues(
 | 
			
		||||
				this.propertySources);
 | 
			
		||||
		assertThat(propertyValues.getPropertyValue("name").getValue()).isEqualTo("bar");
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	@Test
 | 
			
		||||
	public void testNonEnumeratedPlaceholder() {
 | 
			
		||||
		this.propertySources.addFirst(new PropertySource<String>("another", "baz") {
 | 
			
		||||
 | 
			
		||||
			@Override
 | 
			
		||||
			public Object getProperty(String name) {
 | 
			
		||||
				if (name.equals(getSource())) {
 | 
			
		||||
					return "${foo}";
 | 
			
		||||
				}
 | 
			
		||||
				return null;
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
		});
 | 
			
		||||
		PropertySourcesPropertyValues propertyValues = new PropertySourcesPropertyValues(
 | 
			
		||||
				this.propertySources, (Collection<String>) null,
 | 
			
		||||
				Collections.singleton("baz"));
 | 
			
		||||
		assertThat(propertyValues.getPropertyValue("baz").getValue()).isEqualTo("bar");
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	@Test
 | 
			
		||||
	public void testOverriddenValue() {
 | 
			
		||||
		this.propertySources.addFirst(new MapPropertySource("new",
 | 
			
		||||
				Collections.<String, Object>singletonMap("name", "spam")));
 | 
			
		||||
		PropertySourcesPropertyValues propertyValues = new PropertySourcesPropertyValues(
 | 
			
		||||
				this.propertySources);
 | 
			
		||||
		assertThat(propertyValues.getPropertyValue("name").getValue()).isEqualTo("spam");
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	@Test
 | 
			
		||||
	public void testPlaceholdersBinding() {
 | 
			
		||||
		TestBean target = new TestBean();
 | 
			
		||||
		DataBinder binder = new DataBinder(target);
 | 
			
		||||
		binder.bind(new PropertySourcesPropertyValues(this.propertySources));
 | 
			
		||||
		assertThat(target.getName()).isEqualTo("bar");
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	@Test
 | 
			
		||||
	public void testPlaceholdersBindingNonEnumerable() {
 | 
			
		||||
		FooBean target = new FooBean();
 | 
			
		||||
		DataBinder binder = new DataBinder(target);
 | 
			
		||||
		binder.bind(new PropertySourcesPropertyValues(this.propertySources,
 | 
			
		||||
				(Collection<String>) null, Collections.singleton("foo")));
 | 
			
		||||
		assertThat(target.getFoo()).isEqualTo("bar");
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	@Test
 | 
			
		||||
	public void testPlaceholdersBindingWithError() {
 | 
			
		||||
		TestBean target = new TestBean();
 | 
			
		||||
		DataBinder binder = new DataBinder(target);
 | 
			
		||||
		this.propertySources.addFirst(new MapPropertySource("another",
 | 
			
		||||
				Collections.<String, Object>singletonMap("something", "${nonexistent}")));
 | 
			
		||||
		binder.bind(new PropertySourcesPropertyValues(this.propertySources));
 | 
			
		||||
		assertThat(target.getName()).isEqualTo("bar");
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	@Test
 | 
			
		||||
	public void testPlaceholdersErrorInNonEnumerable() {
 | 
			
		||||
		TestBean target = new TestBean();
 | 
			
		||||
		DataBinder binder = new DataBinder(target);
 | 
			
		||||
		this.propertySources.addFirst(new PropertySource<Object>("application", "STUFF") {
 | 
			
		||||
 | 
			
		||||
			@Override
 | 
			
		||||
			public Object getProperty(String name) {
 | 
			
		||||
				return new Object();
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
		});
 | 
			
		||||
		binder.bind(new PropertySourcesPropertyValues(this.propertySources,
 | 
			
		||||
				(Collection<String>) null, Collections.singleton("name")));
 | 
			
		||||
		assertThat(target.getName()).isNull();
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	@Test
 | 
			
		||||
	public void testCollectionProperty() throws Exception {
 | 
			
		||||
		ListBean target = new ListBean();
 | 
			
		||||
		DataBinder binder = new DataBinder(target);
 | 
			
		||||
		Map<String, Object> map = new LinkedHashMap<>();
 | 
			
		||||
		map.put("list[0]", "v0");
 | 
			
		||||
		map.put("list[1]", "v1");
 | 
			
		||||
		this.propertySources.addFirst(new MapPropertySource("values", map));
 | 
			
		||||
		binder.bind(new PropertySourcesPropertyValues(this.propertySources));
 | 
			
		||||
		assertThat(target.getList()).containsExactly("v0", "v1");
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	@Test
 | 
			
		||||
	public void testFirstCollectionPropertyWins() throws Exception {
 | 
			
		||||
		ListBean target = new ListBean();
 | 
			
		||||
		DataBinder binder = new DataBinder(target);
 | 
			
		||||
		Map<String, Object> first = new LinkedHashMap<>();
 | 
			
		||||
		first.put("list[0]", "f0");
 | 
			
		||||
		Map<String, Object> second = new LinkedHashMap<>();
 | 
			
		||||
		second.put("list[0]", "s0");
 | 
			
		||||
		second.put("list[1]", "s1");
 | 
			
		||||
		this.propertySources.addFirst(new MapPropertySource("s", second));
 | 
			
		||||
		this.propertySources.addFirst(new MapPropertySource("f", first));
 | 
			
		||||
		binder.bind(new PropertySourcesPropertyValues(this.propertySources));
 | 
			
		||||
		assertThat(target.getList()).containsExactly("f0");
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	@Test
 | 
			
		||||
	public void testFirstCollectionPropertyWinsNestedAttributes() throws Exception {
 | 
			
		||||
		ListTestBean target = new ListTestBean();
 | 
			
		||||
		DataBinder binder = new DataBinder(target);
 | 
			
		||||
		Map<String, Object> first = new LinkedHashMap<>();
 | 
			
		||||
		first.put("list[0].description", "another description");
 | 
			
		||||
		Map<String, Object> second = new LinkedHashMap<>();
 | 
			
		||||
		second.put("list[0].name", "first name");
 | 
			
		||||
		second.put("list[0].description", "first description");
 | 
			
		||||
		second.put("list[1].name", "second name");
 | 
			
		||||
		second.put("list[1].description", "second description");
 | 
			
		||||
		this.propertySources.addFirst(new MapPropertySource("s", second));
 | 
			
		||||
		this.propertySources.addFirst(new MapPropertySource("f", first));
 | 
			
		||||
		binder.bind(new PropertySourcesPropertyValues(this.propertySources));
 | 
			
		||||
		assertThat(target.getList()).hasSize(1);
 | 
			
		||||
		assertThat(target.getList().get(0).getDescription())
 | 
			
		||||
				.isEqualTo("another description");
 | 
			
		||||
		assertThat(target.getList().get(0).getName()).isNull();
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	public static class TestBean {
 | 
			
		||||
 | 
			
		||||
		private String name;
 | 
			
		||||
 | 
			
		||||
		private String description;
 | 
			
		||||
 | 
			
		||||
		public String getName() {
 | 
			
		||||
			return this.name;
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		public void setName(String name) {
 | 
			
		||||
			this.name = name;
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		public String getDescription() {
 | 
			
		||||
			return this.description;
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		public void setDescription(String description) {
 | 
			
		||||
			this.description = description;
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	public static class FooBean {
 | 
			
		||||
 | 
			
		||||
		private String foo;
 | 
			
		||||
 | 
			
		||||
		public String getFoo() {
 | 
			
		||||
			return this.foo;
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		public void setFoo(String foo) {
 | 
			
		||||
			this.foo = foo;
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	public static class ListBean {
 | 
			
		||||
 | 
			
		||||
		private List<String> list = new ArrayList<>();
 | 
			
		||||
 | 
			
		||||
		public List<String> getList() {
 | 
			
		||||
			return this.list;
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		public void setList(List<String> list) {
 | 
			
		||||
			this.list = list;
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	public static class ListTestBean {
 | 
			
		||||
 | 
			
		||||
		private List<TestBean> list = new ArrayList<>();
 | 
			
		||||
 | 
			
		||||
		public List<TestBean> getList() {
 | 
			
		||||
			return this.list;
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		public void setList(List<TestBean> list) {
 | 
			
		||||
			this.list = list;
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -1,150 +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.Iterator;
 | 
			
		||||
 | 
			
		||||
import org.junit.Test;
 | 
			
		||||
 | 
			
		||||
import static org.assertj.core.api.Assertions.assertThat;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Tests for {@link RelaxedNames}.
 | 
			
		||||
 *
 | 
			
		||||
 * @author Phillip Webb
 | 
			
		||||
 * @author Dave Syer
 | 
			
		||||
 */
 | 
			
		||||
public class RelaxedNamesTests {
 | 
			
		||||
 | 
			
		||||
	@Test
 | 
			
		||||
	public void iterator() throws Exception {
 | 
			
		||||
		Iterator<String> iterator = new RelaxedNames("my-RELAXED-property").iterator();
 | 
			
		||||
		assertThat(iterator.next()).isEqualTo("my-RELAXED-property");
 | 
			
		||||
		assertThat(iterator.next()).isEqualTo("my_RELAXED_property");
 | 
			
		||||
		assertThat(iterator.next()).isEqualTo("myRELAXEDProperty");
 | 
			
		||||
		assertThat(iterator.next()).isEqualTo("myRelaxedProperty");
 | 
			
		||||
		assertThat(iterator.next()).isEqualTo("my-relaxed-property");
 | 
			
		||||
		assertThat(iterator.next()).isEqualTo("my_relaxed_property");
 | 
			
		||||
		assertThat(iterator.next()).isEqualTo("myrelaxedproperty");
 | 
			
		||||
		assertThat(iterator.next()).isEqualTo("MY-RELAXED-PROPERTY");
 | 
			
		||||
		assertThat(iterator.next()).isEqualTo("MY_RELAXED_PROPERTY");
 | 
			
		||||
		assertThat(iterator.next()).isEqualTo("MYRELAXEDPROPERTY");
 | 
			
		||||
		assertThat(iterator.hasNext()).isFalse();
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	@Test
 | 
			
		||||
	public void fromUnderscores() throws Exception {
 | 
			
		||||
		Iterator<String> iterator = new RelaxedNames("nes_ted").iterator();
 | 
			
		||||
		assertThat(iterator.next()).isEqualTo("nes_ted");
 | 
			
		||||
		assertThat(iterator.next()).isEqualTo("nes.ted");
 | 
			
		||||
		assertThat(iterator.next()).isEqualTo("nesTed");
 | 
			
		||||
		assertThat(iterator.next()).isEqualTo("nested");
 | 
			
		||||
		assertThat(iterator.next()).isEqualTo("NES_TED");
 | 
			
		||||
		assertThat(iterator.next()).isEqualTo("NES.TED");
 | 
			
		||||
		assertThat(iterator.next()).isEqualTo("NESTED");
 | 
			
		||||
		assertThat(iterator.hasNext()).isFalse();
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	@Test
 | 
			
		||||
	public void fromPlain() throws Exception {
 | 
			
		||||
		Iterator<String> iterator = new RelaxedNames("plain").iterator();
 | 
			
		||||
		assertThat(iterator.next()).isEqualTo("plain");
 | 
			
		||||
		assertThat(iterator.next()).isEqualTo("PLAIN");
 | 
			
		||||
		assertThat(iterator.hasNext()).isFalse();
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	@Test
 | 
			
		||||
	public void fromCamelCase() throws Exception {
 | 
			
		||||
		Iterator<String> iterator = new RelaxedNames("caMel").iterator();
 | 
			
		||||
		assertThat(iterator.next()).isEqualTo("caMel");
 | 
			
		||||
		assertThat(iterator.next()).isEqualTo("ca_mel");
 | 
			
		||||
		assertThat(iterator.next()).isEqualTo("ca-mel");
 | 
			
		||||
		assertThat(iterator.next()).isEqualTo("camel");
 | 
			
		||||
		assertThat(iterator.next()).isEqualTo("CAMEL");
 | 
			
		||||
		assertThat(iterator.next()).isEqualTo("CA_MEL");
 | 
			
		||||
		assertThat(iterator.next()).isEqualTo("CA-MEL");
 | 
			
		||||
		assertThat(iterator.hasNext()).isFalse();
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	@Test
 | 
			
		||||
	public void fromCompoundCamelCase() throws Exception {
 | 
			
		||||
		Iterator<String> iterator = new RelaxedNames("caMelCase").iterator();
 | 
			
		||||
		assertThat(iterator.next()).isEqualTo("caMelCase");
 | 
			
		||||
		assertThat(iterator.next()).isEqualTo("ca_mel_case");
 | 
			
		||||
		assertThat(iterator.next()).isEqualTo("ca-mel-case");
 | 
			
		||||
		assertThat(iterator.next()).isEqualTo("camelcase");
 | 
			
		||||
		assertThat(iterator.next()).isEqualTo("CAMELCASE");
 | 
			
		||||
		assertThat(iterator.next()).isEqualTo("CA_MEL_CASE");
 | 
			
		||||
		assertThat(iterator.next()).isEqualTo("CA-MEL-CASE");
 | 
			
		||||
		assertThat(iterator.hasNext()).isFalse();
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	@Test
 | 
			
		||||
	public void fromPeriods() throws Exception {
 | 
			
		||||
		Iterator<String> iterator = new RelaxedNames("spring.value").iterator();
 | 
			
		||||
		assertThat(iterator.next()).isEqualTo("spring.value");
 | 
			
		||||
		assertThat(iterator.next()).isEqualTo("spring_value");
 | 
			
		||||
		assertThat(iterator.next()).isEqualTo("springValue");
 | 
			
		||||
		assertThat(iterator.next()).isEqualTo("springvalue");
 | 
			
		||||
		assertThat(iterator.next()).isEqualTo("SPRING.VALUE");
 | 
			
		||||
		assertThat(iterator.next()).isEqualTo("SPRING_VALUE");
 | 
			
		||||
		assertThat(iterator.next()).isEqualTo("SPRINGVALUE");
 | 
			
		||||
		assertThat(iterator.hasNext()).isFalse();
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	@Test
 | 
			
		||||
	public void fromPrefixEndingInPeriod() throws Exception {
 | 
			
		||||
		Iterator<String> iterator = new RelaxedNames("spring.").iterator();
 | 
			
		||||
		assertThat(iterator.next()).isEqualTo("spring.");
 | 
			
		||||
		assertThat(iterator.next()).isEqualTo("spring_");
 | 
			
		||||
		assertThat(iterator.next()).isEqualTo("SPRING.");
 | 
			
		||||
		assertThat(iterator.next()).isEqualTo("SPRING_");
 | 
			
		||||
		assertThat(iterator.hasNext()).isFalse();
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	@Test
 | 
			
		||||
	public void fromEmpty() throws Exception {
 | 
			
		||||
		Iterator<String> iterator = new RelaxedNames("").iterator();
 | 
			
		||||
		assertThat(iterator.next()).isEqualTo("");
 | 
			
		||||
		assertThat(iterator.hasNext()).isFalse();
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	@Test
 | 
			
		||||
	public void forCamelCase() throws Exception {
 | 
			
		||||
		Iterator<String> iterator = RelaxedNames.forCamelCase("camelCase").iterator();
 | 
			
		||||
		assertThat(iterator.next()).isEqualTo("camel-case");
 | 
			
		||||
		assertThat(iterator.next()).isEqualTo("camel_case");
 | 
			
		||||
		assertThat(iterator.next()).isEqualTo("camelCase");
 | 
			
		||||
		assertThat(iterator.next()).isEqualTo("camelcase");
 | 
			
		||||
		assertThat(iterator.next()).isEqualTo("CAMEL-CASE");
 | 
			
		||||
		assertThat(iterator.next()).isEqualTo("CAMEL_CASE");
 | 
			
		||||
		assertThat(iterator.next()).isEqualTo("CAMELCASE");
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	@Test
 | 
			
		||||
	public void forCamelCaseWithCaps() throws Exception {
 | 
			
		||||
		Iterator<String> iterator = RelaxedNames.forCamelCase("camelCASE").iterator();
 | 
			
		||||
		assertThat(iterator.next()).isEqualTo("camel-c-a-s-e");
 | 
			
		||||
		assertThat(iterator.next()).isEqualTo("camel_c_a_s_e");
 | 
			
		||||
		assertThat(iterator.next()).isEqualTo("camelCASE");
 | 
			
		||||
		assertThat(iterator.next()).isEqualTo("camelcase");
 | 
			
		||||
		assertThat(iterator.next()).isEqualTo("CAMEL-C-A-S-E");
 | 
			
		||||
		assertThat(iterator.next()).isEqualTo("CAMEL_C_A_S_E");
 | 
			
		||||
		assertThat(iterator.next()).isEqualTo("CAMELCASE");
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -1,197 +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 java.util.Properties;
 | 
			
		||||
 | 
			
		||||
import org.junit.Before;
 | 
			
		||||
import org.junit.Rule;
 | 
			
		||||
import org.junit.Test;
 | 
			
		||||
import org.junit.rules.ExpectedException;
 | 
			
		||||
 | 
			
		||||
import org.springframework.core.env.MapPropertySource;
 | 
			
		||||
import org.springframework.core.env.MutablePropertySources;
 | 
			
		||||
import org.springframework.core.env.PropertiesPropertySource;
 | 
			
		||||
import org.springframework.core.env.StandardEnvironment;
 | 
			
		||||
 | 
			
		||||
import static org.assertj.core.api.Assertions.assertThat;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Tests for {@link RelaxedPropertyResolver}.
 | 
			
		||||
 *
 | 
			
		||||
 * @author Phillip Webb
 | 
			
		||||
 * @author Stephane Nicoll
 | 
			
		||||
 */
 | 
			
		||||
public class RelaxedPropertyResolverTests {
 | 
			
		||||
 | 
			
		||||
	@Rule
 | 
			
		||||
	public ExpectedException thrown = ExpectedException.none();
 | 
			
		||||
 | 
			
		||||
	private StandardEnvironment environment;
 | 
			
		||||
 | 
			
		||||
	private RelaxedPropertyResolver resolver;
 | 
			
		||||
 | 
			
		||||
	private LinkedHashMap<String, Object> source;
 | 
			
		||||
 | 
			
		||||
	@Before
 | 
			
		||||
	public void setup() {
 | 
			
		||||
		this.environment = new StandardEnvironment();
 | 
			
		||||
		this.source = new LinkedHashMap<>();
 | 
			
		||||
		this.source.put("myString", "value");
 | 
			
		||||
		this.source.put("myobject", "object");
 | 
			
		||||
		this.source.put("myInteger", 123);
 | 
			
		||||
		this.source.put("myClass", "java.lang.String");
 | 
			
		||||
		this.environment.getPropertySources()
 | 
			
		||||
				.addFirst(new MapPropertySource("test", this.source));
 | 
			
		||||
		this.resolver = new RelaxedPropertyResolver(this.environment);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	@Test
 | 
			
		||||
	public void needsPropertyResolver() throws Exception {
 | 
			
		||||
		this.thrown.expect(IllegalArgumentException.class);
 | 
			
		||||
		this.thrown.expectMessage("PropertyResolver must not be null");
 | 
			
		||||
		new RelaxedPropertyResolver(null);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	@Test
 | 
			
		||||
	public void getRequiredProperty() throws Exception {
 | 
			
		||||
		assertThat(this.resolver.getRequiredProperty("my-string")).isEqualTo("value");
 | 
			
		||||
		this.thrown.expect(IllegalStateException.class);
 | 
			
		||||
		this.thrown.expectMessage("required key [my-missing] not found");
 | 
			
		||||
		this.resolver.getRequiredProperty("my-missing");
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	@Test
 | 
			
		||||
	public void getRequiredPropertyWithType() throws Exception {
 | 
			
		||||
		assertThat(this.resolver.getRequiredProperty("my-integer", Integer.class))
 | 
			
		||||
				.isEqualTo(123);
 | 
			
		||||
		this.thrown.expect(IllegalStateException.class);
 | 
			
		||||
		this.thrown.expectMessage("required key [my-missing] not found");
 | 
			
		||||
		this.resolver.getRequiredProperty("my-missing", Integer.class);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	@Test
 | 
			
		||||
	public void getProperty() throws Exception {
 | 
			
		||||
		assertThat(this.resolver.getProperty("my-string")).isEqualTo("value");
 | 
			
		||||
		assertThat(this.resolver.getProperty("my-missing")).isNull();
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	@Test
 | 
			
		||||
	public void getPropertyNoSeparator() throws Exception {
 | 
			
		||||
		assertThat(this.resolver.getProperty("myobject")).isEqualTo("object");
 | 
			
		||||
		assertThat(this.resolver.getProperty("my-object")).isEqualTo("object");
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	@Test
 | 
			
		||||
	public void getPropertyWithDefault() throws Exception {
 | 
			
		||||
		assertThat(this.resolver.getProperty("my-string", "a")).isEqualTo("value");
 | 
			
		||||
		assertThat(this.resolver.getProperty("my-missing", "a")).isEqualTo("a");
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	@Test
 | 
			
		||||
	public void getPropertyWithType() throws Exception {
 | 
			
		||||
		assertThat(this.resolver.getProperty("my-integer", Integer.class)).isEqualTo(123);
 | 
			
		||||
		assertThat(this.resolver.getProperty("my-missing", Integer.class)).isNull();
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	@Test
 | 
			
		||||
	public void getPropertyWithTypeAndDefault() throws Exception {
 | 
			
		||||
		assertThat(this.resolver.getProperty("my-integer", Integer.class, 345))
 | 
			
		||||
				.isEqualTo(123);
 | 
			
		||||
		assertThat(this.resolver.getProperty("my-missing", Integer.class, 345))
 | 
			
		||||
				.isEqualTo(345);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	@Test
 | 
			
		||||
	public void containsProperty() throws Exception {
 | 
			
		||||
		assertThat(this.resolver.containsProperty("my-string")).isTrue();
 | 
			
		||||
		assertThat(this.resolver.containsProperty("myString")).isTrue();
 | 
			
		||||
		assertThat(this.resolver.containsProperty("my_string")).isTrue();
 | 
			
		||||
		assertThat(this.resolver.containsProperty("my-missing")).isFalse();
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	@Test
 | 
			
		||||
	public void resolverPlaceholder() throws Exception {
 | 
			
		||||
		this.thrown.expect(UnsupportedOperationException.class);
 | 
			
		||||
		this.resolver.resolvePlaceholders("test");
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	@Test
 | 
			
		||||
	public void resolveRequiredPlaceholders() throws Exception {
 | 
			
		||||
		this.thrown.expect(UnsupportedOperationException.class);
 | 
			
		||||
		this.resolver.resolveRequiredPlaceholders("test");
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	@Test
 | 
			
		||||
	public void prefixed() throws Exception {
 | 
			
		||||
		this.resolver = new RelaxedPropertyResolver(this.environment, "a.b.c.");
 | 
			
		||||
		this.source.put("a.b.c.d", "test");
 | 
			
		||||
		assertThat(this.resolver.containsProperty("d")).isTrue();
 | 
			
		||||
		assertThat(this.resolver.getProperty("d")).isEqualTo("test");
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	@Test
 | 
			
		||||
	public void prefixedRelaxed() throws Exception {
 | 
			
		||||
		this.resolver = new RelaxedPropertyResolver(this.environment, "a.");
 | 
			
		||||
		this.source.put("A_B", "test");
 | 
			
		||||
		this.source.put("a.foobar", "spam");
 | 
			
		||||
		assertThat(this.resolver.containsProperty("b")).isTrue();
 | 
			
		||||
		assertThat(this.resolver.getProperty("b")).isEqualTo("test");
 | 
			
		||||
		assertThat(this.resolver.getProperty("foo-bar")).isEqualTo("spam");
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	@Test
 | 
			
		||||
	public void subProperties() throws Exception {
 | 
			
		||||
		this.source.put("x.y.my-sub.a.b", "1");
 | 
			
		||||
		this.source.put("x.y.mySub.a.c", "2");
 | 
			
		||||
		this.source.put("x.y.MY_SUB.a.d", "3");
 | 
			
		||||
		this.resolver = new RelaxedPropertyResolver(this.environment, "x.y.");
 | 
			
		||||
		Map<String, Object> subProperties = this.resolver.getSubProperties("my-sub.");
 | 
			
		||||
		assertThat(subProperties.size()).isEqualTo(3);
 | 
			
		||||
		assertThat(subProperties.get("a.b")).isEqualTo("1");
 | 
			
		||||
		assertThat(subProperties.get("a.c")).isEqualTo("2");
 | 
			
		||||
		assertThat(subProperties.get("a.d")).isEqualTo("3");
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	@Test
 | 
			
		||||
	public void testPropertySource() throws Exception {
 | 
			
		||||
		Properties properties;
 | 
			
		||||
		PropertiesPropertySource propertySource;
 | 
			
		||||
		String propertyPrefix = "spring.datasource.";
 | 
			
		||||
		String propertyName = "password";
 | 
			
		||||
		String fullPropertyName = propertyPrefix + propertyName;
 | 
			
		||||
		StandardEnvironment environment = new StandardEnvironment();
 | 
			
		||||
		MutablePropertySources sources = environment.getPropertySources();
 | 
			
		||||
		properties = new Properties();
 | 
			
		||||
		properties.put(fullPropertyName, "systemPassword");
 | 
			
		||||
		propertySource = new PropertiesPropertySource("system", properties);
 | 
			
		||||
		sources.addLast(propertySource);
 | 
			
		||||
		properties = new Properties();
 | 
			
		||||
		properties.put(fullPropertyName, "propertiesPassword");
 | 
			
		||||
		propertySource = new PropertiesPropertySource("properties", properties);
 | 
			
		||||
		sources.addLast(propertySource);
 | 
			
		||||
		RelaxedPropertyResolver propertyResolver = new RelaxedPropertyResolver(
 | 
			
		||||
				environment, propertyPrefix);
 | 
			
		||||
		String directProperty = propertyResolver.getProperty(propertyName);
 | 
			
		||||
		Map<String, Object> subProperties = propertyResolver.getSubProperties("");
 | 
			
		||||
		String subProperty = (String) subProperties.get(propertyName);
 | 
			
		||||
		assertThat(subProperty).isEqualTo(directProperty);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -1,87 +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 org.junit.Test;
 | 
			
		||||
import org.junit.runner.RunWith;
 | 
			
		||||
 | 
			
		||||
import org.springframework.beans.factory.annotation.Autowired;
 | 
			
		||||
import org.springframework.beans.factory.annotation.Value;
 | 
			
		||||
import org.springframework.boot.bind.SimplerPropertySourcesBindingTests.TestConfig;
 | 
			
		||||
import org.springframework.boot.context.properties.ConfigurationProperties;
 | 
			
		||||
import org.springframework.boot.context.properties.EnableConfigurationProperties;
 | 
			
		||||
import org.springframework.context.annotation.Bean;
 | 
			
		||||
import org.springframework.context.annotation.Configuration;
 | 
			
		||||
import org.springframework.context.annotation.PropertySource;
 | 
			
		||||
import org.springframework.context.annotation.PropertySources;
 | 
			
		||||
import org.springframework.context.support.PropertySourcesPlaceholderConfigurer;
 | 
			
		||||
import org.springframework.test.annotation.DirtiesContext;
 | 
			
		||||
import org.springframework.test.context.ContextConfiguration;
 | 
			
		||||
import org.springframework.test.context.junit4.SpringRunner;
 | 
			
		||||
 | 
			
		||||
import static org.assertj.core.api.Assertions.assertThat;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Tests for {@link PropertySourcesPropertyValues} binding.
 | 
			
		||||
 *
 | 
			
		||||
 * @author Dave Syer
 | 
			
		||||
 */
 | 
			
		||||
@RunWith(SpringRunner.class)
 | 
			
		||||
@DirtiesContext
 | 
			
		||||
@ContextConfiguration(classes = TestConfig.class, loader = SpringApplicationBindContextLoader.class)
 | 
			
		||||
public class SimplerPropertySourcesBindingTests {
 | 
			
		||||
 | 
			
		||||
	@Value("${foo:}")
 | 
			
		||||
	private String foo;
 | 
			
		||||
 | 
			
		||||
	@Autowired
 | 
			
		||||
	private Wrapper properties;
 | 
			
		||||
 | 
			
		||||
	@Test
 | 
			
		||||
	public void overridingOfPropertiesWorksAsExpected() {
 | 
			
		||||
		assertThat(this.foo).isEqualTo(this.properties.getFoo());
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	@PropertySources({ @PropertySource("classpath:/override.properties"),
 | 
			
		||||
			@PropertySource("classpath:/some.properties") })
 | 
			
		||||
	@Configuration
 | 
			
		||||
	@EnableConfigurationProperties(Wrapper.class)
 | 
			
		||||
	public static class TestConfig {
 | 
			
		||||
 | 
			
		||||
		@Bean
 | 
			
		||||
		public static PropertySourcesPlaceholderConfigurer propertySourcesPlaceholderConfigurer() {
 | 
			
		||||
			return new PropertySourcesPlaceholderConfigurer();
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	@ConfigurationProperties
 | 
			
		||||
	public static class Wrapper {
 | 
			
		||||
 | 
			
		||||
		private String foo;
 | 
			
		||||
 | 
			
		||||
		public String getFoo() {
 | 
			
		||||
			return this.foo;
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		public void setFoo(String foo) {
 | 
			
		||||
			this.foo = foo;
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
		Loading…
	
		Reference in New Issue