CompositePropertySource extends EnumerablePropertySource now

Issue: SPR-12292
This commit is contained in:
Juergen Hoeller 2014-10-02 20:19:32 +02:00
parent fd69ee541e
commit 9d969587ab
3 changed files with 41 additions and 5 deletions

View File

@ -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]",

View File

@ -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.

View File

@ -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) {