From b6aa0f24e2d1ea371d12741182a946623c8d08e0 Mon Sep 17 00:00:00 2001 From: Stephane Nicoll Date: Wed, 13 Dec 2017 10:18:08 +0100 Subject: [PATCH] Clean endpointIds in generated metadata Closes gh-11107 --- ...figurationMetadataAnnotationProcessor.java | 12 ++--- .../metadata/ConfigurationMetadata.java | 3 +- .../metadata/ItemMetadata.java | 7 +++ ...ationMetadataAnnotationProcessorTests.java | 22 ++++++-- .../metadata/ItemMetadataTests.java | 51 +++++++++++++++++++ .../endpoint/CamelCaseEndpoint.java | 29 +++++++++++ 6 files changed, 113 insertions(+), 11 deletions(-) create mode 100644 spring-boot-project/spring-boot-tools/spring-boot-configuration-processor/src/test/java/org/springframework/boot/configurationprocessor/metadata/ItemMetadataTests.java create mode 100644 spring-boot-project/spring-boot-tools/spring-boot-configuration-processor/src/test/java/org/springframework/boot/configurationsample/endpoint/CamelCaseEndpoint.java diff --git a/spring-boot-project/spring-boot-tools/spring-boot-configuration-processor/src/main/java/org/springframework/boot/configurationprocessor/ConfigurationMetadataAnnotationProcessor.java b/spring-boot-project/spring-boot-tools/spring-boot-configuration-processor/src/main/java/org/springframework/boot/configurationprocessor/ConfigurationMetadataAnnotationProcessor.java index a622ce6d5d9e..898823149e53 100644 --- a/spring-boot-project/spring-boot-tools/spring-boot-configuration-processor/src/main/java/org/springframework/boot/configurationprocessor/ConfigurationMetadataAnnotationProcessor.java +++ b/spring-boot-project/spring-boot-tools/spring-boot-configuration-processor/src/main/java/org/springframework/boot/configurationprocessor/ConfigurationMetadataAnnotationProcessor.java @@ -416,23 +416,21 @@ private void processEndpoint(AnnotationMirror annotation, TypeElement element) { if (endpointId == null || "".equals(endpointId)) { return; // Can't process that endpoint } + String endpointKey = ItemMetadata.newItemMetadataPrefix( + "management.endpoint.", endpointId); Boolean enabledByDefault = (Boolean) elementValues.get("enableByDefault"); String type = this.typeUtils.getQualifiedName(element); this.metadataCollector - .add(ItemMetadata.newGroup(endpointKey(endpointId), type, type, null)); - this.metadataCollector.add(ItemMetadata.newProperty(endpointKey(endpointId), + .add(ItemMetadata.newGroup(endpointKey, type, type, null)); + this.metadataCollector.add(ItemMetadata.newProperty(endpointKey, "enabled", Boolean.class.getName(), type, null, String.format("Whether to enable the %s endpoint.", endpointId), (enabledByDefault == null ? true : enabledByDefault), null)); - this.metadataCollector.add(ItemMetadata.newProperty(endpointKey(endpointId), + this.metadataCollector.add(ItemMetadata.newProperty(endpointKey, "cache.time-to-live", Duration.class.getName(), type, null, "Maximum time that a response can be cached.", 0, null)); } - private String endpointKey(String suffix) { - return "management.endpoint." + suffix; - } - private boolean isNested(Element returnType, VariableElement field, TypeElement element) { if (hasAnnotation(field, nestedConfigurationPropertyAnnotation())) { diff --git a/spring-boot-project/spring-boot-tools/spring-boot-configuration-processor/src/main/java/org/springframework/boot/configurationprocessor/metadata/ConfigurationMetadata.java b/spring-boot-project/spring-boot-tools/spring-boot-configuration-processor/src/main/java/org/springframework/boot/configurationprocessor/metadata/ConfigurationMetadata.java index a92152a0a930..3cb990265f84 100644 --- a/spring-boot-project/spring-boot-tools/spring-boot-configuration-processor/src/main/java/org/springframework/boot/configurationprocessor/metadata/ConfigurationMetadata.java +++ b/spring-boot-project/spring-boot-tools/spring-boot-configuration-processor/src/main/java/org/springframework/boot/configurationprocessor/metadata/ConfigurationMetadata.java @@ -22,6 +22,7 @@ import java.util.HashSet; import java.util.LinkedHashMap; import java.util.List; +import java.util.Locale; import java.util.Map; import java.util.Set; @@ -191,7 +192,7 @@ else if (Character.isUpperCase(current) && previous != null previous = current; } - return dashed.toString().toLowerCase(); + return dashed.toString().toLowerCase(Locale.ENGLISH); } private static > List flattenValues(Map> map) { diff --git a/spring-boot-project/spring-boot-tools/spring-boot-configuration-processor/src/main/java/org/springframework/boot/configurationprocessor/metadata/ItemMetadata.java b/spring-boot-project/spring-boot-tools/spring-boot-configuration-processor/src/main/java/org/springframework/boot/configurationprocessor/metadata/ItemMetadata.java index 6cd1483829ba..7fb607faca4d 100644 --- a/spring-boot-project/spring-boot-tools/spring-boot-configuration-processor/src/main/java/org/springframework/boot/configurationprocessor/metadata/ItemMetadata.java +++ b/spring-boot-project/spring-boot-tools/spring-boot-configuration-processor/src/main/java/org/springframework/boot/configurationprocessor/metadata/ItemMetadata.java @@ -16,6 +16,8 @@ package org.springframework.boot.configurationprocessor.metadata; +import java.util.Locale; + /** * A group or property meta-data item from some {@link ConfigurationMetadata}. * @@ -215,6 +217,11 @@ public static ItemMetadata newProperty(String prefix, String name, String type, sourceMethod, description, defaultValue, deprecation); } + public static String newItemMetadataPrefix(String prefix, String suffix) { + return prefix.toLowerCase(Locale.ENGLISH) + + ConfigurationMetadata.toDashedCase(suffix); + } + /** * The item type. */ diff --git a/spring-boot-project/spring-boot-tools/spring-boot-configuration-processor/src/test/java/org/springframework/boot/configurationprocessor/ConfigurationMetadataAnnotationProcessorTests.java b/spring-boot-project/spring-boot-tools/spring-boot-configuration-processor/src/test/java/org/springframework/boot/configurationprocessor/ConfigurationMetadataAnnotationProcessorTests.java index 8a4fddf2441c..1cac4df5890a 100644 --- a/spring-boot-project/spring-boot-tools/spring-boot-configuration-processor/src/test/java/org/springframework/boot/configurationprocessor/ConfigurationMetadataAnnotationProcessorTests.java +++ b/spring-boot-project/spring-boot-tools/spring-boot-configuration-processor/src/test/java/org/springframework/boot/configurationprocessor/ConfigurationMetadataAnnotationProcessorTests.java @@ -37,6 +37,7 @@ import org.springframework.boot.configurationprocessor.metadata.ItemMetadata; import org.springframework.boot.configurationprocessor.metadata.Metadata; import org.springframework.boot.configurationprocessor.metadata.TestJsonConverter; +import org.springframework.boot.configurationsample.endpoint.CamelCaseEndpoint; import org.springframework.boot.configurationsample.endpoint.CustomPropertiesEndpoint; import org.springframework.boot.configurationsample.endpoint.DisabledEndpoint; import org.springframework.boot.configurationsample.endpoint.EnabledEndpoint; @@ -583,6 +584,16 @@ public void specificEndpoint() { assertThat(metadata.getItems()).hasSize(3); } + @Test + public void camelCaseEndpoint() { + ConfigurationMetadata metadata = compile(CamelCaseEndpoint.class); + assertThat(metadata).has(Metadata.withGroup("management.endpoint.pascal-case") + .fromSource(CamelCaseEndpoint.class)); + assertThat(metadata).has(enabledFlag("PascalCase", "pascal-case", true)); + assertThat(metadata).has(cacheTtl("pascal-case")); + assertThat(metadata.getItems()).hasSize(3); + } + @Test public void incrementalEndpointBuildChangeGeneralEnabledFlag() throws Exception { TestProject project = new TestProject(this.temporaryFolder, @@ -623,11 +634,16 @@ public void incrementalEndpointBuildEnableSpecificEndpoint() throws Exception { assertThat(metadata.getItems()).hasSize(3); } + private Metadata.MetadataItemCondition enabledFlag(String endpointId, + String endpointSuffix, Boolean defaultValue) { + return Metadata.withEnabledFlag("management.endpoint." + endpointSuffix + + ".enabled").withDefaultValue(defaultValue).withDescription( + String.format("Whether to enable the %s endpoint.", endpointId)); + } + private Metadata.MetadataItemCondition enabledFlag(String endpointId, Boolean defaultValue) { - return Metadata.withEnabledFlag("management.endpoint." + endpointId + ".enabled") - .withDefaultValue(defaultValue).withDescription( - String.format("Whether to enable the %s endpoint.", endpointId)); + return enabledFlag(endpointId, endpointId, defaultValue); } private Metadata.MetadataItemCondition cacheTtl(String endpointId) { diff --git a/spring-boot-project/spring-boot-tools/spring-boot-configuration-processor/src/test/java/org/springframework/boot/configurationprocessor/metadata/ItemMetadataTests.java b/spring-boot-project/spring-boot-tools/spring-boot-configuration-processor/src/test/java/org/springframework/boot/configurationprocessor/metadata/ItemMetadataTests.java new file mode 100644 index 000000000000..1dde24761448 --- /dev/null +++ b/spring-boot-project/spring-boot-tools/spring-boot-configuration-processor/src/test/java/org/springframework/boot/configurationprocessor/metadata/ItemMetadataTests.java @@ -0,0 +1,51 @@ +/* + * Copyright 2012-2017 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.springframework.boot.configurationprocessor.metadata; + +import org.junit.Test; + +import static org.assertj.core.api.Assertions.assertThat; + +/** + * Tests for {@link ItemMetadata}. + * + * @author Stephane Nicoll + */ +public class ItemMetadataTests { + + @Test + public void newItemMetadataPrefixWithUpperCasePrefix() { + assertThat(newItemMetadataPrefix("Prefix.", "value")).isEqualTo("prefix.value"); + } + + @Test + public void newItemMetadataPrefixWithCamelCaseSuffix() { + assertThat(newItemMetadataPrefix("prefix.", "myValue")) + .isEqualTo("prefix.my-value"); + } + + @Test + public void newItemMetadataPrefixWithUpperCamelCaseSuffix() { + assertThat(newItemMetadataPrefix("prefix.", "MyValue")) + .isEqualTo("prefix.my-value"); + } + + private String newItemMetadataPrefix(String prefix, String suffix) { + return ItemMetadata.newItemMetadataPrefix(prefix, suffix); + } + +} diff --git a/spring-boot-project/spring-boot-tools/spring-boot-configuration-processor/src/test/java/org/springframework/boot/configurationsample/endpoint/CamelCaseEndpoint.java b/spring-boot-project/spring-boot-tools/spring-boot-configuration-processor/src/test/java/org/springframework/boot/configurationsample/endpoint/CamelCaseEndpoint.java new file mode 100644 index 000000000000..0cf8d93fe282 --- /dev/null +++ b/spring-boot-project/spring-boot-tools/spring-boot-configuration-processor/src/test/java/org/springframework/boot/configurationsample/endpoint/CamelCaseEndpoint.java @@ -0,0 +1,29 @@ +/* + * Copyright 2012-2017 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.springframework.boot.configurationsample.endpoint; + +import org.springframework.boot.configurationsample.Endpoint; + +/** + * An endpoint with a upper camel case id. + * + * @author Stephane Nicoll + */ +@Endpoint(id = "PascalCase") +public class CamelCaseEndpoint { + +}