pull/3314/merge
Phillip Webb 10 years ago
parent bc9321734f
commit 778e3eb091

@ -98,6 +98,7 @@ given property. When configuring the `server.tomcat.compression` property, a too
use it to offer some auto-completion help for the `off`, `on` and `force` values. use it to offer some auto-completion help for the `off`, `on` and `force` values.
[[configuration-metadata-group-attributes]] [[configuration-metadata-group-attributes]]
==== Group Attributes ==== Group Attributes
The JSON object contained in the `groups` array can contain the following attributes: The JSON object contained in the `groups` array can contain the following attributes:
@ -189,6 +190,7 @@ The JSON object contained in the `properties` array can contain the following at
|=== |===
[[configuration-metadata-hints-attributes]] [[configuration-metadata-hints-attributes]]
==== Hint Attributes ==== Hint Attributes
The JSON object contained in the `hints` array can contain the following attributes: The JSON object contained in the `hints` array can contain the following attributes:
@ -238,8 +240,10 @@ appear multiple times within a meta-data file. For example, Spring Boot binds
offering overlap of property names. Consumers of meta-data should take care to ensure offering overlap of property names. Consumers of meta-data should take care to ensure
that they support such scenarios. that they support such scenarios.
=== Providing manual hints
[[configuration-metadata-providing-manual-hints]]
=== Providing manual hints
To improve the user experience and further assist the user in configuring a given To improve the user experience and further assist the user in configuring a given
property, you can provide additional meta-data that describes the list of potential property, you can provide additional meta-data that describes the list of potential
values for a property. values for a property.
@ -252,6 +256,8 @@ If your property is of type `Map`, you can provide hints for both the keys and t
values (but not for the map itself). The special `.keys` and `.values` suffixes must values (but not for the map itself). The special `.keys` and `.values` suffixes must
be used to refer to the keys and the values respectively. be used to refer to the keys and the values respectively.
[[configuration-metadata-annotation-processor]] [[configuration-metadata-annotation-processor]]
=== Generating your own meta-data using the annotation processor === Generating your own meta-data using the annotation processor
You can easily generate your own configuration meta-data file from items annotated with You can easily generate your own configuration meta-data file from items annotated with

@ -22,13 +22,13 @@ import java.util.Collections;
import java.util.List; import java.util.List;
/** /**
* Provide hints on an {@link ItemMetadata}. Defines the list of possible values for * Provide hints on an {@link ItemMetadata}. Defines the list of possible values for a
* a particular item as {@link ItemHint.ValueHint} instances. * particular item as {@link ItemHint.ValueHint} instances.
* <p> * <p>
* The {@code name} of the hint is the name of the related property with one major * The {@code name} of the hint is the name of the related property with one major
* exception for map types as both the keys and values of the map can have hints. In * exception for map types as both the keys and values of the map can have hints. In such
* such a case, the hint should be suffixed by ".key" or ".values" respectively. Creating * a case, the hint should be suffixed by ".key" or ".values" respectively. Creating a
* a hint for a map using its property name is therefore invalid. * hint for a map using its property name is therefore invalid.
* *
* @author Stephane Nicoll * @author Stephane Nicoll
* @since 1.3.0 * @since 1.3.0
@ -73,13 +73,12 @@ public class ItemHint implements Comparable<ItemHint> {
@Override @Override
public String toString() { public String toString() {
return "ItemHint{" + "name='" + this.name + '\'' + return "ItemHint{" + "name='" + this.name + '\'' + ", values=" + this.values
", values=" + this.values + + '}';
'}';
} }
public static class ValueHint { public static class ValueHint {
private final Object value; private final Object value;
private final String description; private final String description;
@ -99,9 +98,10 @@ public class ItemHint implements Comparable<ItemHint> {
@Override @Override
public String toString() { public String toString() {
return "ValueHint{" + "value=" + this.value + return "ValueHint{" + "value=" + this.value + ", description='"
", description='" + this.description + '\'' + + this.description + '\'' + '}';
'}';
} }
} }
} }

@ -106,7 +106,6 @@ public class JsonMarshaller {
return jsonObject; return jsonObject;
} }
private void putIfPresent(JSONObject jsonObject, String name, Object value) { private void putIfPresent(JSONObject jsonObject, String name, Object value) {
if (value != null) { if (value != null) {
jsonObject.put(name, value); jsonObject.put(name, value);
@ -192,7 +191,6 @@ public class JsonMarshaller {
return new ItemHint.ValueHint(value, description); return new ItemHint.ValueHint(value, description);
} }
private Object readItemValue(Object value) { private Object readItemValue(Object value) {
if (value instanceof JSONArray) { if (value instanceof JSONArray) {
JSONArray array = (JSONArray) value; JSONArray array = (JSONArray) value;

@ -350,24 +350,23 @@ public class ConfigurationMetadataAnnotationProcessorTests {
@Test @Test
public void mergingOfSimpleHint() throws Exception { public void mergingOfSimpleHint() throws Exception {
writeAdditionalHints( writeAdditionalHints(ItemHint.newHint("simple.the-name", new ItemHint.ValueHint(
ItemHint.newHint("simple.the-name", new ItemHint.ValueHint("boot", "Bla bla"), "boot", "Bla bla"), new ItemHint.ValueHint("spring", null)));
new ItemHint.ValueHint("spring", null)));
ConfigurationMetadata metadata = compile(SimpleProperties.class); ConfigurationMetadata metadata = compile(SimpleProperties.class);
assertThat(metadata, containsHint("simple.the-name") assertThat(metadata,
.withValue(0, "boot", "Bla bla") containsHint("simple.the-name").withValue(0, "boot", "Bla bla")
.withValue(1, "spring", null)); .withValue(1, "spring", null));
} }
@Test @Test
public void mergingOfHintWithNonCanonicalName() throws Exception { public void mergingOfHintWithNonCanonicalName() throws Exception {
writeAdditionalHints( writeAdditionalHints(ItemHint.newHint("simple.theName", new ItemHint.ValueHint(
ItemHint.newHint("simple.theName", new ItemHint.ValueHint("boot", "Bla bla"))); "boot", "Bla bla")));
ConfigurationMetadata metadata = compile(SimpleProperties.class); ConfigurationMetadata metadata = compile(SimpleProperties.class);
assertThat(metadata, containsHint("simple.the-name") assertThat(metadata,
.withValue(0, "boot", "Bla bla")); containsHint("simple.the-name").withValue(0, "boot", "Bla bla"));
} }
@Test @Test

@ -241,8 +241,7 @@ public class ConfigurationMetadataMatchers {
description.appendText("missing hint " + this.name); description.appendText("missing hint " + this.name);
} }
else { else {
description.appendText( description.appendText("was hint ").appendValue(itemHint);
"was hint ").appendValue(itemHint);
} }
} }
@ -260,8 +259,7 @@ public class ConfigurationMetadataMatchers {
return new ContainsHintMatcher(this.name, values); return new ContainsHintMatcher(this.name, values);
} }
private ItemHint getFirstHintWithName(ConfigurationMetadata metadata, private ItemHint getFirstHintWithName(ConfigurationMetadata metadata, String name) {
String name) {
for (ItemHint hint : metadata.getHints()) { for (ItemHint hint : metadata.getHints()) {
if (name.equals(hint.getName())) { if (name.equals(hint.getName())) {
return hint; return hint;
@ -273,8 +271,11 @@ public class ConfigurationMetadataMatchers {
} }
public static class ValueHintMatcher extends BaseMatcher<ItemHint> { public static class ValueHintMatcher extends BaseMatcher<ItemHint> {
private final int index; private final int index;
private final Object value; private final Object value;
private final String description; private final String description;
public ValueHintMatcher(int index, Object value, String description) { public ValueHintMatcher(int index, Object value, String description) {
@ -290,12 +291,11 @@ public class ConfigurationMetadataMatchers {
return false; return false;
} }
ItemHint.ValueHint valueHint = hint.getValues().get(this.index); ItemHint.ValueHint valueHint = hint.getValues().get(this.index);
if (this.value != null if (this.value != null && !this.value.equals(valueHint.getValue())) {
&& !this.value.equals(valueHint.getValue())) {
return false; return false;
} }
if (this.description != null if (this.description != null
&& !this.description.equals(valueHint.getDescription())) { && !this.description.equals(valueHint.getDescription())) {
return false; return false;
} }
return true; return true;
@ -303,7 +303,7 @@ public class ConfigurationMetadataMatchers {
@Override @Override
public void describeTo(Description description) { public void describeTo(Description description) {
description.appendText("value hint at index '"+this.index+"'"); description.appendText("value hint at index '" + this.index + "'");
if (this.value != null) { if (this.value != null) {
description.appendText(" value ").appendValue(this.value); description.appendText(" value ").appendValue(this.value);
} }
@ -312,15 +312,6 @@ public class ConfigurationMetadataMatchers {
} }
} }
private ItemHint.ValueHint getValueHint(ItemHint hint) {
for (ItemHint.ValueHint valueHint : hint.getValues()) {
if (this.value.equals(valueHint.getValue())) {
return valueHint;
}
}
return null;
}
} }
} }

@ -74,7 +74,8 @@ public class JsonMarshallerTests {
containsProperty("f").withDefaultValue(is(new boolean[] { true, false }))); containsProperty("f").withDefaultValue(is(new boolean[] { true, false })));
assertThat(read, containsGroup("d")); assertThat(read, containsGroup("d"));
assertThat(read, containsHint("a.b")); assertThat(read, containsHint("a.b"));
assertThat(read, containsHint("c").withValue(0, 123, "hey").withValue(1, 456, null)); assertThat(read,
containsHint("c").withValue(0, 123, "hey").withValue(1, 456, null));
} }
} }

Loading…
Cancel
Save