Browse Source

Polish "Respect lombok.AccessLevel attributes"

Closes gh-13175
pull/13215/head
Stephane Nicoll 8 years ago
parent
commit
563d7d70a2
  1. 48
      spring-boot-tools/spring-boot-configuration-processor/src/main/java/org/springframework/boot/configurationprocessor/ConfigurationMetadataAnnotationProcessor.java
  2. 39
      spring-boot-tools/spring-boot-configuration-processor/src/test/java/org/springframework/boot/configurationprocessor/ConfigurationMetadataAnnotationProcessorTests.java
  3. 31
      spring-boot-tools/spring-boot-configuration-processor/src/test/java/org/springframework/boot/configurationsample/lombok/LombokAccessLevelOverwriteDataProperties.java
  4. 41
      spring-boot-tools/spring-boot-configuration-processor/src/test/java/org/springframework/boot/configurationsample/lombok/LombokAccessLevelOverwriteDefaultProperties.java
  5. 41
      spring-boot-tools/spring-boot-configuration-processor/src/test/java/org/springframework/boot/configurationsample/lombok/LombokAccessLevelOverwriteExplicitProperties.java
  6. 59
      spring-boot-tools/spring-boot-configuration-processor/src/test/java/org/springframework/boot/configurationsample/lombok/LombokAccessLevelProperties.java
  7. 6
      spring-boot-tools/spring-boot-configuration-processor/src/test/java/org/springframework/boot/configurationsample/lombok/LombokExplicitProperties.java

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

@ -77,10 +77,7 @@ public class ConfigurationMetadataAnnotationProcessor extends AbstractProcessor
static final String LOMBOK_SETTER_ANNOTATION = "lombok.Setter"; static final String LOMBOK_SETTER_ANNOTATION = "lombok.Setter";
private static final String LOMBOK_ACCESS_LEVEL = "lombok.AccessLevel"; static final String LOMBOK_ACCESS_LEVEL_PUBLIC = "PUBLIC";
private static final String LOMBOK_ACCESS_LEVEL_PUBLIC = LOMBOK_ACCESS_LEVEL
+ ".PUBLIC";
private MetadataStore metadataStore; private MetadataStore metadataStore;
@ -308,35 +305,44 @@ public class ConfigurationMetadataAnnotationProcessor extends AbstractProcessor
} }
private boolean isLombokField(VariableElement field, TypeElement element) { private boolean isLombokField(VariableElement field, TypeElement element) {
return hasLombokPublicMethod(field, element, LOMBOK_GETTER_ANNOTATION); return hasLombokPublicAccessor(field, element, true);
} }
private boolean hasLombokSetter(VariableElement field, TypeElement element) { private boolean hasLombokSetter(VariableElement field, TypeElement element) {
return !field.getModifiers().contains(Modifier.FINAL) return !field.getModifiers().contains(Modifier.FINAL)
&& hasLombokPublicMethod(field, element, LOMBOK_SETTER_ANNOTATION); && hasLombokPublicAccessor(field, element, false);
} }
private boolean hasLombokPublicMethod(VariableElement field, TypeElement element, /**
String lombokMethodAnnotation) { * Determine if the specified {@link VariableElement field} defines a public accessor
AnnotationMirror lombokMethodAnnotationOnField = getAnnotation(field, * using lombok annotations.
lombokMethodAnnotation); * @param field the field to inspect
* @param element the parent element of the field (i.e. its holding class)
* @param getter {@code true} to look for the read accessor, {@code false} for the
* write accessor
* @return {@code true} if this field is a public accessor of the specified type
*/
private boolean hasLombokPublicAccessor(VariableElement field, TypeElement element,
boolean getter) {
String annotation = (getter ? LOMBOK_GETTER_ANNOTATION
: LOMBOK_SETTER_ANNOTATION);
AnnotationMirror lombokMethodAnnotationOnField = getAnnotation(field, annotation);
if (lombokMethodAnnotationOnField != null) { if (lombokMethodAnnotationOnField != null) {
return isLombokPublic(lombokMethodAnnotationOnField); return isAccessLevelPublic(lombokMethodAnnotationOnField);
} }
AnnotationMirror lombokMethodAnnotationOnElement = getAnnotation(element, AnnotationMirror lombokMethodAnnotationOnElement = getAnnotation(element,
lombokMethodAnnotation); annotation);
if (lombokMethodAnnotationOnElement != null) { if (lombokMethodAnnotationOnElement != null) {
return isLombokPublic(lombokMethodAnnotationOnElement); return isAccessLevelPublic(lombokMethodAnnotationOnElement);
} }
return hasAnnotation(element, LOMBOK_DATA_ANNOTATION); return hasAnnotation(element, LOMBOK_DATA_ANNOTATION);
} }
private boolean isLombokPublic(AnnotationMirror lombokAnnotation) {
return lombokAnnotation.getElementValues().values().stream() private boolean isAccessLevelPublic(AnnotationMirror lombokAnnotation) {
.noneMatch(e -> e.toString().startsWith(LOMBOK_ACCESS_LEVEL) Map<String, Object> values = getAnnotationElementValues(lombokAnnotation);
&& !e.toString().equals(LOMBOK_ACCESS_LEVEL_PUBLIC)); Object value = values.get("value");
return (value == null || value.toString().equals(LOMBOK_ACCESS_LEVEL_PUBLIC));
} }
private void processNestedType(String prefix, TypeElement element, private void processNestedType(String prefix, TypeElement element,

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

@ -488,6 +488,21 @@ public class ConfigurationMetadataAnnotationProcessorTests {
assertSimpleLombokProperties(metadata, LombokSimpleProperties.class, "simple"); assertSimpleLombokProperties(metadata, LombokSimpleProperties.class, "simple");
} }
@Test
public void lombokExplicitProperties() throws Exception {
ConfigurationMetadata metadata = compile(LombokExplicitProperties.class);
assertSimpleLombokProperties(metadata, LombokExplicitProperties.class,
"explicit");
assertThat(metadata.getItems()).hasSize(6);
}
@Test
public void lombokAccessLevelProperties() {
ConfigurationMetadata metadata = compile(LombokAccessLevelProperties.class);
assertAccessLevelLombokProperties(metadata, LombokAccessLevelProperties.class,
"accesslevel", 2);
}
@Test @Test
public void lombokAccessLevelOverwriteDataProperties() { public void lombokAccessLevelOverwriteDataProperties() {
ConfigurationMetadata metadata = compile( ConfigurationMetadata metadata = compile(
@ -515,20 +530,6 @@ public class ConfigurationMetadataAnnotationProcessorTests {
"accesslevel.overwrite.default"); "accesslevel.overwrite.default");
} }
@Test
public void lombokAccessLevelProperties() {
ConfigurationMetadata metadata = compile(LombokAccessLevelProperties.class);
assertAccessLevelLombokProperties(metadata, LombokAccessLevelProperties.class,
"accesslevel", 2, 20);
}
@Test
public void lombokExplicitProperties() throws Exception {
ConfigurationMetadata metadata = compile(LombokExplicitProperties.class);
assertSimpleLombokProperties(metadata, LombokExplicitProperties.class,
"explicit");
}
@Test @Test
public void lombokInnerClassProperties() throws Exception { public void lombokInnerClassProperties() throws Exception {
ConfigurationMetadata metadata = compile(LombokInnerClassProperties.class); ConfigurationMetadata metadata = compile(LombokInnerClassProperties.class);
@ -830,21 +831,17 @@ public class ConfigurationMetadataAnnotationProcessorTests {
private void assertAccessLevelOverwriteLombokProperties( private void assertAccessLevelOverwriteLombokProperties(
ConfigurationMetadata metadata, Class<?> source, String prefix) { ConfigurationMetadata metadata, Class<?> source, String prefix) {
assertAccessLevelLombokProperties(metadata, source, prefix, 7, 15); assertAccessLevelLombokProperties(metadata, source, prefix, 7);
} }
private void assertAccessLevelLombokProperties(ConfigurationMetadata metadata, private void assertAccessLevelLombokProperties(ConfigurationMetadata metadata,
Class<?> source, String prefix, int countNameFields, int countIgnoredFields) { Class<?> source, String prefix, int countNameFields) {
assertThat(metadata).has(Metadata.withGroup(prefix).fromSource(source)); assertThat(metadata).has(Metadata.withGroup(prefix).fromSource(source));
for (int i = 0; i < countNameFields; i++) { for (int i = 0; i < countNameFields; i++) {
assertThat(metadata) assertThat(metadata)
.has(Metadata.withProperty(prefix + ".name" + i, String.class)); .has(Metadata.withProperty(prefix + ".name" + i, String.class));
} }
assertThat(metadata.getItems()).hasSize(1 + countNameFields);
for (int i = 0; i < countIgnoredFields; i++) {
assertThat(metadata)
.doesNotHave(Metadata.withProperty(prefix + ".ignored" + i));
}
} }
private ConfigurationMetadata compile(Class<?>... types) { private ConfigurationMetadata compile(Class<?>... types) {

31
spring-boot-tools/spring-boot-configuration-processor/src/test/java/org/springframework/boot/configurationsample/lombok/LombokAccessLevelOverwriteDataProperties.java

@ -60,63 +60,64 @@ public class LombokAccessLevelOverwriteDataProperties {
*/ */
@Getter(AccessLevel.NONE) @Getter(AccessLevel.NONE)
@Setter(AccessLevel.NONE) @Setter(AccessLevel.NONE)
private String ignored0; private String ignoredAccessLevelNone;
@Getter(AccessLevel.NONE) @Getter(AccessLevel.NONE)
private String ignored1; private String ignoredGetterAccessLevelNone;
@Setter(AccessLevel.NONE) @Setter(AccessLevel.NONE)
private String ignored2; private String ignoredSetterAccessLevelNone;
/* /*
* AccessLevel.PRIVATE * AccessLevel.PRIVATE
*/ */
@Getter(AccessLevel.PRIVATE) @Getter(AccessLevel.PRIVATE)
@Setter(AccessLevel.PRIVATE) @Setter(AccessLevel.PRIVATE)
private String ignored3; private String ignoredAccessLevelPrivate;
@Getter(AccessLevel.PRIVATE) @Getter(AccessLevel.PRIVATE)
private String ignored4; private String ignoredGetterAccessLevelPrivate;
@Setter(AccessLevel.PRIVATE) @Setter(AccessLevel.PRIVATE)
private String ignored5; private String ignoredSetterAccessLevelPrivate;
/* /*
* AccessLevel.PACKAGE * AccessLevel.PACKAGE
*/ */
@Getter(AccessLevel.PACKAGE) @Getter(AccessLevel.PACKAGE)
@Setter(AccessLevel.PACKAGE) @Setter(AccessLevel.PACKAGE)
private String ignored6; private String ignoredAccessLevelPackage;
@Getter(AccessLevel.PACKAGE) @Getter(AccessLevel.PACKAGE)
private String ignored7; private String ignoredGetterAccessLevelPackage;
@Setter(AccessLevel.PACKAGE) @Setter(AccessLevel.PACKAGE)
private String ignored8; private String ignoredSetterAccessLevelPackage;
/* /*
* AccessLevel.PROTECTED * AccessLevel.PROTECTED
*/ */
@Getter(AccessLevel.PROTECTED) @Getter(AccessLevel.PROTECTED)
@Setter(AccessLevel.PROTECTED) @Setter(AccessLevel.PROTECTED)
private String ignored9; private String ignoredAccessLevelProtected;
@Getter(AccessLevel.PROTECTED) @Getter(AccessLevel.PROTECTED)
private String ignored10; private String ignoredGetterAccessLevelProtected;
@Setter(AccessLevel.PROTECTED) @Setter(AccessLevel.PROTECTED)
private String ignored11; private String ignoredSetterAccessLevelProtected;
/* /*
* AccessLevel.MODULE * AccessLevel.MODULE
*/ */
@Getter(AccessLevel.MODULE) @Getter(AccessLevel.MODULE)
@Setter(AccessLevel.MODULE) @Setter(AccessLevel.MODULE)
private String ignored12; private String ignoredAccessLevelModule;
@Getter(AccessLevel.MODULE) @Getter(AccessLevel.MODULE)
private String ignored13; private String ignoredGetterAccessLevelModule;
@Setter(AccessLevel.MODULE) @Setter(AccessLevel.MODULE)
private String ignored14; private String ignoredSetterAccessLevelModule;
} }

41
spring-boot-tools/spring-boot-configuration-processor/src/test/java/org/springframework/boot/configurationsample/lombok/LombokAccessLevelOverwriteDefaultProperties.java

@ -1,5 +1,5 @@
/* /*
* Copyright 2012-2017 the original author or authors. * Copyright 2012-2018 the original author or authors.
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
@ -60,63 +60,34 @@ public class LombokAccessLevelOverwriteDefaultProperties {
*/ */
@Getter(AccessLevel.NONE) @Getter(AccessLevel.NONE)
@Setter(AccessLevel.NONE) @Setter(AccessLevel.NONE)
private String ignored0; private String ignoredAccessLevelNone;
@Getter(AccessLevel.NONE)
private String ignored1;
@Setter(AccessLevel.NONE)
private String ignored2;
/* /*
* AccessLevel.PRIVATE * AccessLevel.PRIVATE
*/ */
@Getter(AccessLevel.PRIVATE) @Getter(AccessLevel.PRIVATE)
@Setter(AccessLevel.PRIVATE) @Setter(AccessLevel.PRIVATE)
private String ignored3; private String ignoredAccessLevelPrivate;
@Getter(AccessLevel.PRIVATE)
private String ignored4;
@Setter(AccessLevel.PRIVATE)
private String ignored5;
/* /*
* AccessLevel.PACKAGE * AccessLevel.PACKAGE
*/ */
@Getter(AccessLevel.PACKAGE) @Getter(AccessLevel.PACKAGE)
@Setter(AccessLevel.PACKAGE) @Setter(AccessLevel.PACKAGE)
private String ignored6; private String ignoredAccessLevelPackage;
@Getter(AccessLevel.PACKAGE)
private String ignored7;
@Setter(AccessLevel.PACKAGE)
private String ignored8;
/* /*
* AccessLevel.PROTECTED * AccessLevel.PROTECTED
*/ */
@Getter(AccessLevel.PROTECTED) @Getter(AccessLevel.PROTECTED)
@Setter(AccessLevel.PROTECTED) @Setter(AccessLevel.PROTECTED)
private String ignored9; private String ignoredAccessLevelProtected;
@Getter(AccessLevel.PROTECTED)
private String ignored10;
@Setter(AccessLevel.PROTECTED)
private String ignored11;
/* /*
* AccessLevel.MODULE * AccessLevel.MODULE
*/ */
@Getter(AccessLevel.MODULE) @Getter(AccessLevel.MODULE)
@Setter(AccessLevel.MODULE) @Setter(AccessLevel.MODULE)
private String ignored12; private String ignoredAccessLevelModule;
@Getter(AccessLevel.MODULE)
private String ignored13;
@Setter(AccessLevel.MODULE)
private String ignored14;
} }

41
spring-boot-tools/spring-boot-configuration-processor/src/test/java/org/springframework/boot/configurationsample/lombok/LombokAccessLevelOverwriteExplicitProperties.java

@ -1,5 +1,5 @@
/* /*
* Copyright 2012-2017 the original author or authors. * Copyright 2012-2018 the original author or authors.
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
@ -60,63 +60,34 @@ public class LombokAccessLevelOverwriteExplicitProperties {
*/ */
@Getter(AccessLevel.NONE) @Getter(AccessLevel.NONE)
@Setter(AccessLevel.NONE) @Setter(AccessLevel.NONE)
private String ignored0; private String ignoredAccessLevelNone;
@Getter(AccessLevel.NONE)
private String ignored1;
@Setter(AccessLevel.NONE)
private String ignored2;
/* /*
* AccessLevel.PRIVATE * AccessLevel.PRIVATE
*/ */
@Getter(AccessLevel.PRIVATE) @Getter(AccessLevel.PRIVATE)
@Setter(AccessLevel.PRIVATE) @Setter(AccessLevel.PRIVATE)
private String ignored3; private String ignoredAccessLevelPrivate;
@Getter(AccessLevel.PRIVATE)
private String ignored4;
@Setter(AccessLevel.PRIVATE)
private String ignored5;
/* /*
* AccessLevel.PACKAGE * AccessLevel.PACKAGE
*/ */
@Getter(AccessLevel.PACKAGE) @Getter(AccessLevel.PACKAGE)
@Setter(AccessLevel.PACKAGE) @Setter(AccessLevel.PACKAGE)
private String ignored6; private String ignoredAccessLevelPackage;
@Getter(AccessLevel.PACKAGE)
private String ignored7;
@Setter(AccessLevel.PACKAGE)
private String ignored8;
/* /*
* AccessLevel.PROTECTED * AccessLevel.PROTECTED
*/ */
@Getter(AccessLevel.PROTECTED) @Getter(AccessLevel.PROTECTED)
@Setter(AccessLevel.PROTECTED) @Setter(AccessLevel.PROTECTED)
private String ignored9; private String ignoredAccessLevelProtected;
@Getter(AccessLevel.PROTECTED)
private String ignored10;
@Setter(AccessLevel.PROTECTED)
private String ignored11;
/* /*
* AccessLevel.MODULE * AccessLevel.MODULE
*/ */
@Getter(AccessLevel.MODULE) @Getter(AccessLevel.MODULE)
@Setter(AccessLevel.MODULE) @Setter(AccessLevel.MODULE)
private String ignored12; private String ignoredAccessLevelModule;
@Getter(AccessLevel.MODULE)
private String ignored13;
@Setter(AccessLevel.MODULE)
private String ignored14;
} }

59
spring-boot-tools/spring-boot-configuration-processor/src/test/java/org/springframework/boot/configurationsample/lombok/LombokAccessLevelProperties.java

@ -1,5 +1,5 @@
/* /*
* Copyright 2012-2017 the original author or authors. * Copyright 2012-2018 the original author or authors.
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
@ -43,86 +43,43 @@ public class LombokAccessLevelProperties {
*/ */
@Getter(AccessLevel.NONE) @Getter(AccessLevel.NONE)
@Setter(AccessLevel.NONE) @Setter(AccessLevel.NONE)
private String ignored0; private String ignoredAccessLevelNone;
@Getter(AccessLevel.NONE)
private String ignored1;
@Setter(AccessLevel.NONE)
private String ignored2;
/* /*
* AccessLevel.PRIVATE * AccessLevel.PRIVATE
*/ */
@Getter(AccessLevel.PRIVATE) @Getter(AccessLevel.PRIVATE)
@Setter(AccessLevel.PRIVATE) @Setter(AccessLevel.PRIVATE)
private String ignored3; private String ignoredAccessLevelPrivate;
@Getter(AccessLevel.PRIVATE)
private String ignored4;
@Setter(AccessLevel.PRIVATE)
private String ignored5;
/* /*
* AccessLevel.PACKAGE * AccessLevel.PACKAGE
*/ */
@Getter(AccessLevel.PACKAGE) @Getter(AccessLevel.PACKAGE)
@Setter(AccessLevel.PACKAGE) @Setter(AccessLevel.PACKAGE)
private String ignored6; private String ignoredAccessLevelPackage;
@Getter(AccessLevel.PACKAGE)
private String ignored7;
@Setter(AccessLevel.PACKAGE)
private String ignored8;
/* /*
* AccessLevel.PROTECTED * AccessLevel.PROTECTED
*/ */
@Getter(AccessLevel.PROTECTED) @Getter(AccessLevel.PROTECTED)
@Setter(AccessLevel.PROTECTED) @Setter(AccessLevel.PROTECTED)
private String ignored9; private String ignoredAccessLevelProtected;
@Getter(AccessLevel.PROTECTED)
private String ignored10;
@Setter(AccessLevel.PROTECTED)
private String ignored11;
/* /*
* AccessLevel.MODULE * AccessLevel.MODULE
*/ */
@Getter(AccessLevel.MODULE) @Getter(AccessLevel.MODULE)
@Setter(AccessLevel.MODULE) @Setter(AccessLevel.MODULE)
private String ignored12; private String ignoredAccessLevelModule;
@Getter(AccessLevel.MODULE)
private String ignored13;
@Setter(AccessLevel.MODULE)
private String ignored14;
/*
* Nor getter neither setter defined
*/
private String ignored15;
/* /*
* Either PUBLIC getter or setter explicitly defined * Either PUBLIC getter or setter explicitly defined
*/ */
@Getter(AccessLevel.PUBLIC) @Getter(AccessLevel.PUBLIC)
private String ignored16; private String ignoredOnlyPublicGetter;
@Setter(AccessLevel.PUBLIC) @Setter(AccessLevel.PUBLIC)
private String ignored17; private String ignoredOnlyPublicSetter;
/*
* Either PUBLIC getter or setter implicitly defined
*/
@Getter
private String ignored18;
@Setter
private String ignored19;
} }

6
spring-boot-tools/spring-boot-configuration-processor/src/test/java/org/springframework/boot/configurationsample/lombok/LombokExplicitProperties.java

@ -62,4 +62,10 @@ public class LombokExplicitProperties {
@SuppressWarnings("unused") @SuppressWarnings("unused")
private String ignored; private String ignored;
@Getter
private String ignoredOnlyGetter;
@Setter
private String ignoredOnlySetter;
} }

Loading…
Cancel
Save