From 9d969587ab6f60c6f24b2c49e94b5858e588cb9a Mon Sep 17 00:00:00 2001 From: Juergen Hoeller Date: Thu, 2 Oct 2014 20:19:32 +0200 Subject: [PATCH] CompositePropertySource extends EnumerablePropertySource now Issue: SPR-12292 --- .../core/env/CompositePropertySource.java | 33 ++++++++++++++++++- .../core/env/EnumerablePropertySource.java | 5 +++ .../core/env/PropertySource.java | 8 ++--- 3 files changed, 41 insertions(+), 5 deletions(-) diff --git a/spring-core/src/main/java/org/springframework/core/env/CompositePropertySource.java b/spring-core/src/main/java/org/springframework/core/env/CompositePropertySource.java index 6ce1d0d7794..07ddbaed6a5 100644 --- a/spring-core/src/main/java/org/springframework/core/env/CompositePropertySource.java +++ b/spring-core/src/main/java/org/springframework/core/env/CompositePropertySource.java @@ -17,21 +17,29 @@ package org.springframework.core.env; import java.util.ArrayList; +import java.util.Arrays; import java.util.Collection; import java.util.LinkedHashSet; import java.util.List; import java.util.Set; +import org.springframework.util.StringUtils; + /** * Composite {@link PropertySource} implementation that iterates over a set of * {@link PropertySource} instances. Necessary in cases where multiple property sources * share the same name, e.g. when multiple values are supplied to {@code @PropertySource}. * + *

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 Juergen Hoeller * @author Phillip Webb * @since 3.1.1 */ -public class CompositePropertySource extends PropertySource { +public class CompositePropertySource extends EnumerablePropertySource { private final Set> propertySources = new LinkedHashSet>(); @@ -56,6 +64,28 @@ public class CompositePropertySource extends PropertySource { 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 names = new LinkedHashSet(); + 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. * @param propertySource the PropertySource to add @@ -84,6 +114,7 @@ public class CompositePropertySource extends PropertySource { return this.propertySources; } + @Override public String toString() { return String.format("%s [name='%s', propertySources=%s]", diff --git a/spring-core/src/main/java/org/springframework/core/env/EnumerablePropertySource.java b/spring-core/src/main/java/org/springframework/core/env/EnumerablePropertySource.java index e63a3c733d8..79541483a76 100644 --- a/spring-core/src/main/java/org/springframework/core/env/EnumerablePropertySource.java +++ b/spring-core/src/main/java/org/springframework/core/env/EnumerablePropertySource.java @@ -47,6 +47,11 @@ public abstract class EnumerablePropertySource extends PropertySource { super(name, source); } + @SuppressWarnings("unchecked") + protected EnumerablePropertySource(String name) { + super(name); + } + /** * Return whether this {@code PropertySource} contains a property with the given name. diff --git a/spring-core/src/main/java/org/springframework/core/env/PropertySource.java b/spring-core/src/main/java/org/springframework/core/env/PropertySource.java index 3fbdd045c79..4d4f4ee86c6 100644 --- a/spring-core/src/main/java/org/springframework/core/env/PropertySource.java +++ b/spring-core/src/main/java/org/springframework/core/env/PropertySource.java @@ -75,10 +75,10 @@ public abstract class PropertySource { } /** - * Create a new {@code PropertySource} with the given name and with a new {@code Object} - * instance as the underlying source. - *

Often useful in testing scenarios when creating anonymous implementations that - * never query an actual source but rather return hard-coded values. + * Create a new {@code PropertySource} with the given name and with a new + * {@code Object} instance as the underlying source. + *

Often useful in testing scenarios when creating anonymous implementations + * that never query an actual source but rather return hard-coded values. */ @SuppressWarnings("unchecked") public PropertySource(String name) {