Browse Source

Refine inner class detection algorithm

Update the ConfigurationMetadataAnnotationProcessor nested class
algorithm to prevent inner classes being added as both groups and
properties.

Fixes gh-1975
pull/1979/head
Phillip Webb 11 years ago
parent
commit
e56a1ba561
  1. 28
      spring-boot-tools/spring-boot-configuration-processor/src/main/java/org/springframework/boot/configurationprocessor/ConfigurationMetadataAnnotationProcessor.java
  2. 7
      spring-boot-tools/spring-boot-configuration-processor/src/test/java/org/springframework/boot/configurationprocessor/ConfigurationMetadataAnnotationProcessorTests.java
  3. 7
      spring-boot-tools/spring-boot-configuration-processor/src/test/java/org/springframework/boot/configurationprocessor/ConfigurationMetadataMatchers.java

28
spring-boot-tools/spring-boot-configuration-processor/src/main/java/org/springframework/boot/configurationprocessor/ConfigurationMetadataAnnotationProcessor.java

@ -175,8 +175,9 @@ public class ConfigurationMetadataAnnotationProcessor extends AbstractProcessor @@ -175,8 +175,9 @@ public class ConfigurationMetadataAnnotationProcessor extends AbstractProcessor
ExecutableElement getter = entry.getValue();
ExecutableElement setter = members.getPublicSetters().get(name);
VariableElement field = members.getFields().get(name);
boolean isNested = getAnnotation(field,
nestedConfigurationPropertyAnnotation()) != null;
Element returnType = this.processingEnv.getTypeUtils().asElement(
getter.getReturnType());
boolean isNested = isNested(returnType, field, element);
boolean isCollection = this.typeUtils.isCollectionOrMap(getter
.getReturnType());
if (!isNested && (setter != null || isCollection)) {
@ -203,22 +204,25 @@ public class ConfigurationMetadataAnnotationProcessor extends AbstractProcessor @@ -203,22 +204,25 @@ public class ConfigurationMetadataAnnotationProcessor extends AbstractProcessor
getter.getReturnType());
AnnotationMirror annotation = getAnnotation(getter,
configurationPropertiesAnnotation());
boolean isNested = getAnnotation(field,
nestedConfigurationPropertyAnnotation()) != null;
boolean isNested = isNested(returnType, field, element);
if (returnType != null && returnType instanceof TypeElement
&& annotation == null) {
TypeElement returns = (TypeElement) returnType;
if ((this.typeUtils.isEnclosedIn(returnType, element) && returnType
.getKind() != ElementKind.ENUM) || isNested) {
String nestedPrefix = ConfigurationMetadata
.nestedPrefix(prefix, name);
&& annotation == null && isNested) {
String nestedPrefix = ConfigurationMetadata.nestedPrefix(prefix, name);
this.metadata.add(ItemMetadata.newGroup(nestedPrefix,
this.typeUtils.getType(returns),
this.typeUtils.getType(returnType),
this.typeUtils.getType(element), getter.toString()));
processTypeElement(nestedPrefix, returns);
processTypeElement(nestedPrefix, (TypeElement) returnType);
}
}
}
private boolean isNested(Element returnType, VariableElement field,
TypeElement element) {
if (getAnnotation(field, nestedConfigurationPropertyAnnotation()) != null) {
return true;
}
return this.typeUtils.isEnclosedIn(returnType, element)
&& returnType.getKind() != ElementKind.ENUM;
}
private boolean hasDeprecateAnnotation(Element element) {

7
spring-boot-tools/spring-boot-configuration-processor/src/test/java/org/springframework/boot/configurationprocessor/ConfigurationMetadataAnnotationProcessorTests.java

@ -236,17 +236,14 @@ public class ConfigurationMetadataAnnotationProcessorTests { @@ -236,17 +236,14 @@ public class ConfigurationMetadataAnnotationProcessorTests {
assertThat(metadata, containsProperty("config.first.name"));
assertThat(metadata, containsProperty("config.first.bar.name"));
assertThat(metadata,
containsProperty("config.the-second", InnerClassProperties.Foo.class)
containsGroup("config.the-second", InnerClassProperties.Foo.class)
.fromSource(InnerClassProperties.class));
assertThat(metadata, containsProperty("config.the-second.name"));
assertThat(metadata, containsProperty("config.the-second.bar.name"));
assertThat(metadata, containsGroup("config.third").ofType(SimplePojo.class)
.fromSource(InnerClassProperties.class));
assertThat(metadata, containsProperty("config.third.value"));
assertThat(
metadata,
containsProperty("config.fourth").ofType(
InnerClassProperties.Fourth.class));
assertThat(metadata, containsProperty("config.fourth"));
assertThat(metadata, not(containsGroup("config.fourth")));
}

7
spring-boot-tools/spring-boot-configuration-processor/src/test/java/org/springframework/boot/configurationprocessor/ConfigurationMetadataMatchers.java

@ -119,10 +119,13 @@ public class ConfigurationMetadataMatchers { @@ -119,10 +119,13 @@ public class ConfigurationMetadataMatchers {
ConfigurationMetadata metadata = (ConfigurationMetadata) item;
ItemMetadata property = getFirstPropertyWithName(metadata, this.name);
if (property == null) {
description.appendText("missing property " + this.name);
description.appendText("missing "
+ this.itemType.toString().toLowerCase() + " " + this.name);
}
else {
description.appendText("was property ").appendValue(property);
description.appendText(
"was " + this.itemType.toString().toLowerCase() + " ")
.appendValue(property);
}
}

Loading…
Cancel
Save