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.
[[configuration-metadata-group-attributes]]
==== Group 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]]
==== Hint 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
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
property, you can provide additional meta-data that describes the list of potential
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
be used to refer to the keys and the values respectively.
[[configuration-metadata-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

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

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

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

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