CompositePropertySource extends EnumerablePropertySource now
Issue: SPR-12292
This commit is contained in:
		
							parent
							
								
									fd69ee541e
								
							
						
					
					
						commit
						9d969587ab
					
				| 
						 | 
					@ -17,21 +17,29 @@
 | 
				
			||||||
package org.springframework.core.env;
 | 
					package org.springframework.core.env;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import java.util.ArrayList;
 | 
					import java.util.ArrayList;
 | 
				
			||||||
 | 
					import java.util.Arrays;
 | 
				
			||||||
import java.util.Collection;
 | 
					import java.util.Collection;
 | 
				
			||||||
import java.util.LinkedHashSet;
 | 
					import java.util.LinkedHashSet;
 | 
				
			||||||
import java.util.List;
 | 
					import java.util.List;
 | 
				
			||||||
import java.util.Set;
 | 
					import java.util.Set;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import org.springframework.util.StringUtils;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/**
 | 
					/**
 | 
				
			||||||
 * Composite {@link PropertySource} implementation that iterates over a set of
 | 
					 * Composite {@link PropertySource} implementation that iterates over a set of
 | 
				
			||||||
 * {@link PropertySource} instances. Necessary in cases where multiple property sources
 | 
					 * {@link PropertySource} instances. Necessary in cases where multiple property sources
 | 
				
			||||||
 * share the same name, e.g. when multiple values are supplied to {@code @PropertySource}.
 | 
					 * share the same name, e.g. when multiple values are supplied to {@code @PropertySource}.
 | 
				
			||||||
 *
 | 
					 *
 | 
				
			||||||
 | 
					 * <p>As of Spring 4.1.2, this class extends {@link EnumerablePropertySource} instead
 | 
				
			||||||
 | 
					 * of plain {@link PropertySource}, exposing {@link #getPropertyNames()} based on the
 | 
				
			||||||
 | 
					 * accumulated property names from all contained sources (as far as possible).
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 * @author Chris Beams
 | 
					 * @author Chris Beams
 | 
				
			||||||
 | 
					 * @author Juergen Hoeller
 | 
				
			||||||
 * @author Phillip Webb
 | 
					 * @author Phillip Webb
 | 
				
			||||||
 * @since 3.1.1
 | 
					 * @since 3.1.1
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
public class CompositePropertySource extends PropertySource<Object> {
 | 
					public class CompositePropertySource extends EnumerablePropertySource<Object> {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	private final Set<PropertySource<?>> propertySources = new LinkedHashSet<PropertySource<?>>();
 | 
						private final Set<PropertySource<?>> propertySources = new LinkedHashSet<PropertySource<?>>();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -56,6 +64,28 @@ public class CompositePropertySource extends PropertySource<Object> {
 | 
				
			||||||
		return null;
 | 
							return null;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						@Override
 | 
				
			||||||
 | 
						public boolean containsProperty(String name) {
 | 
				
			||||||
 | 
							for (PropertySource<?> propertySource : this.propertySources) {
 | 
				
			||||||
 | 
								if (propertySource.containsProperty(name)) {
 | 
				
			||||||
 | 
									return true;
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							return false;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						@Override
 | 
				
			||||||
 | 
						public String[] getPropertyNames() {
 | 
				
			||||||
 | 
							Set<String> names = new LinkedHashSet<String>();
 | 
				
			||||||
 | 
							for (PropertySource<?> propertySource : this.propertySources) {
 | 
				
			||||||
 | 
								if (propertySource instanceof EnumerablePropertySource) {
 | 
				
			||||||
 | 
									names.addAll(Arrays.asList(((EnumerablePropertySource<?>) propertySource).getPropertyNames()));
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							return StringUtils.toStringArray(names);
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/**
 | 
						/**
 | 
				
			||||||
	 * Add the given {@link PropertySource} to the end of the chain.
 | 
						 * Add the given {@link PropertySource} to the end of the chain.
 | 
				
			||||||
	 * @param propertySource the PropertySource to add
 | 
						 * @param propertySource the PropertySource to add
 | 
				
			||||||
| 
						 | 
					@ -84,6 +114,7 @@ public class CompositePropertySource extends PropertySource<Object> {
 | 
				
			||||||
		return this.propertySources;
 | 
							return this.propertySources;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	@Override
 | 
						@Override
 | 
				
			||||||
	public String toString() {
 | 
						public String toString() {
 | 
				
			||||||
		return String.format("%s [name='%s', propertySources=%s]",
 | 
							return String.format("%s [name='%s', propertySources=%s]",
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -47,6 +47,11 @@ public abstract class EnumerablePropertySource<T> extends PropertySource<T> {
 | 
				
			||||||
		super(name, source);
 | 
							super(name, source);
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						@SuppressWarnings("unchecked")
 | 
				
			||||||
 | 
						protected EnumerablePropertySource(String name) {
 | 
				
			||||||
 | 
							super(name);
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/**
 | 
						/**
 | 
				
			||||||
	 * Return whether this {@code PropertySource} contains a property with the given name.
 | 
						 * Return whether this {@code PropertySource} contains a property with the given name.
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -75,10 +75,10 @@ public abstract class PropertySource<T> {
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/**
 | 
						/**
 | 
				
			||||||
	 * Create a new {@code PropertySource} with the given name and with a new {@code Object}
 | 
						 * Create a new {@code PropertySource} with the given name and with a new
 | 
				
			||||||
	 * instance as the underlying source.
 | 
						 * {@code Object} instance as the underlying source.
 | 
				
			||||||
	 * <p>Often useful in testing scenarios when creating anonymous implementations that
 | 
						 * <p>Often useful in testing scenarios when creating anonymous implementations
 | 
				
			||||||
	 * never query an actual source but rather return hard-coded values.
 | 
						 * that never query an actual source but rather return hard-coded values.
 | 
				
			||||||
	 */
 | 
						 */
 | 
				
			||||||
	@SuppressWarnings("unchecked")
 | 
						@SuppressWarnings("unchecked")
 | 
				
			||||||
	public PropertySource(String name) {
 | 
						public PropertySource(String name) {
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in New Issue