From 563d7d70a23a318959cd162b6480b8f31befd531 Mon Sep 17 00:00:00 2001 From: Stephane Nicoll Date: Wed, 16 May 2018 12:57:54 +0200 Subject: [PATCH] Polish "Respect lombok.AccessLevel attributes" Closes gh-13175 --- ...figurationMetadataAnnotationProcessor.java | 48 ++++++++------- ...ationMetadataAnnotationProcessorTests.java | 39 ++++++------ ...bokAccessLevelOverwriteDataProperties.java | 31 +++++----- ...AccessLevelOverwriteDefaultProperties.java | 41 ++----------- ...ccessLevelOverwriteExplicitProperties.java | 41 ++----------- .../lombok/LombokAccessLevelProperties.java | 59 +++---------------- .../lombok/LombokExplicitProperties.java | 6 ++ 7 files changed, 87 insertions(+), 178 deletions(-) diff --git a/spring-boot-tools/spring-boot-configuration-processor/src/main/java/org/springframework/boot/configurationprocessor/ConfigurationMetadataAnnotationProcessor.java b/spring-boot-tools/spring-boot-configuration-processor/src/main/java/org/springframework/boot/configurationprocessor/ConfigurationMetadataAnnotationProcessor.java index 001bdf6d65c..2e337f6665d 100644 --- a/spring-boot-tools/spring-boot-configuration-processor/src/main/java/org/springframework/boot/configurationprocessor/ConfigurationMetadataAnnotationProcessor.java +++ b/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"; - private static final String LOMBOK_ACCESS_LEVEL = "lombok.AccessLevel"; - - private static final String LOMBOK_ACCESS_LEVEL_PUBLIC = LOMBOK_ACCESS_LEVEL - + ".PUBLIC"; + static final String LOMBOK_ACCESS_LEVEL_PUBLIC = "PUBLIC"; private MetadataStore metadataStore; @@ -308,35 +305,44 @@ public class ConfigurationMetadataAnnotationProcessor extends AbstractProcessor } 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) { return !field.getModifiers().contains(Modifier.FINAL) - && hasLombokPublicMethod(field, element, LOMBOK_SETTER_ANNOTATION); - } - - private boolean hasLombokPublicMethod(VariableElement field, TypeElement element, - String lombokMethodAnnotation) { - AnnotationMirror lombokMethodAnnotationOnField = getAnnotation(field, - lombokMethodAnnotation); + && hasLombokPublicAccessor(field, element, false); + } + + /** + * Determine if the specified {@link VariableElement field} defines a public accessor + * using lombok annotations. + * @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) { - return isLombokPublic(lombokMethodAnnotationOnField); + return isAccessLevelPublic(lombokMethodAnnotationOnField); } - AnnotationMirror lombokMethodAnnotationOnElement = getAnnotation(element, - lombokMethodAnnotation); + annotation); if (lombokMethodAnnotationOnElement != null) { - return isLombokPublic(lombokMethodAnnotationOnElement); + return isAccessLevelPublic(lombokMethodAnnotationOnElement); } - return hasAnnotation(element, LOMBOK_DATA_ANNOTATION); } - private boolean isLombokPublic(AnnotationMirror lombokAnnotation) { - return lombokAnnotation.getElementValues().values().stream() - .noneMatch(e -> e.toString().startsWith(LOMBOK_ACCESS_LEVEL) - && !e.toString().equals(LOMBOK_ACCESS_LEVEL_PUBLIC)); + + private boolean isAccessLevelPublic(AnnotationMirror lombokAnnotation) { + Map values = getAnnotationElementValues(lombokAnnotation); + Object value = values.get("value"); + return (value == null || value.toString().equals(LOMBOK_ACCESS_LEVEL_PUBLIC)); } private void processNestedType(String prefix, TypeElement element, diff --git a/spring-boot-tools/spring-boot-configuration-processor/src/test/java/org/springframework/boot/configurationprocessor/ConfigurationMetadataAnnotationProcessorTests.java b/spring-boot-tools/spring-boot-configuration-processor/src/test/java/org/springframework/boot/configurationprocessor/ConfigurationMetadataAnnotationProcessorTests.java index df3f6b5c6dd..65ac9bb67e4 100644 --- a/spring-boot-tools/spring-boot-configuration-processor/src/test/java/org/springframework/boot/configurationprocessor/ConfigurationMetadataAnnotationProcessorTests.java +++ b/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"); } + @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 public void lombokAccessLevelOverwriteDataProperties() { ConfigurationMetadata metadata = compile( @@ -515,20 +530,6 @@ public class ConfigurationMetadataAnnotationProcessorTests { "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 public void lombokInnerClassProperties() throws Exception { ConfigurationMetadata metadata = compile(LombokInnerClassProperties.class); @@ -830,21 +831,17 @@ public class ConfigurationMetadataAnnotationProcessorTests { private void assertAccessLevelOverwriteLombokProperties( ConfigurationMetadata metadata, Class source, String prefix) { - assertAccessLevelLombokProperties(metadata, source, prefix, 7, 15); + assertAccessLevelLombokProperties(metadata, source, prefix, 7); } 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)); for (int i = 0; i < countNameFields; i++) { assertThat(metadata) .has(Metadata.withProperty(prefix + ".name" + i, String.class)); } - - for (int i = 0; i < countIgnoredFields; i++) { - assertThat(metadata) - .doesNotHave(Metadata.withProperty(prefix + ".ignored" + i)); - } + assertThat(metadata.getItems()).hasSize(1 + countNameFields); } private ConfigurationMetadata compile(Class... types) { diff --git a/spring-boot-tools/spring-boot-configuration-processor/src/test/java/org/springframework/boot/configurationsample/lombok/LombokAccessLevelOverwriteDataProperties.java b/spring-boot-tools/spring-boot-configuration-processor/src/test/java/org/springframework/boot/configurationsample/lombok/LombokAccessLevelOverwriteDataProperties.java index f8eeeb5b3df..b458be59f38 100644 --- a/spring-boot-tools/spring-boot-configuration-processor/src/test/java/org/springframework/boot/configurationsample/lombok/LombokAccessLevelOverwriteDataProperties.java +++ b/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) @Setter(AccessLevel.NONE) - private String ignored0; + private String ignoredAccessLevelNone; @Getter(AccessLevel.NONE) - private String ignored1; + private String ignoredGetterAccessLevelNone; @Setter(AccessLevel.NONE) - private String ignored2; + private String ignoredSetterAccessLevelNone; /* * AccessLevel.PRIVATE */ @Getter(AccessLevel.PRIVATE) @Setter(AccessLevel.PRIVATE) - private String ignored3; + private String ignoredAccessLevelPrivate; @Getter(AccessLevel.PRIVATE) - private String ignored4; + private String ignoredGetterAccessLevelPrivate; @Setter(AccessLevel.PRIVATE) - private String ignored5; + private String ignoredSetterAccessLevelPrivate; /* * AccessLevel.PACKAGE */ @Getter(AccessLevel.PACKAGE) @Setter(AccessLevel.PACKAGE) - private String ignored6; + private String ignoredAccessLevelPackage; @Getter(AccessLevel.PACKAGE) - private String ignored7; + private String ignoredGetterAccessLevelPackage; @Setter(AccessLevel.PACKAGE) - private String ignored8; + private String ignoredSetterAccessLevelPackage; /* * AccessLevel.PROTECTED */ @Getter(AccessLevel.PROTECTED) @Setter(AccessLevel.PROTECTED) - private String ignored9; + private String ignoredAccessLevelProtected; @Getter(AccessLevel.PROTECTED) - private String ignored10; + private String ignoredGetterAccessLevelProtected; @Setter(AccessLevel.PROTECTED) - private String ignored11; + private String ignoredSetterAccessLevelProtected; /* * AccessLevel.MODULE */ @Getter(AccessLevel.MODULE) @Setter(AccessLevel.MODULE) - private String ignored12; + private String ignoredAccessLevelModule; @Getter(AccessLevel.MODULE) - private String ignored13; + private String ignoredGetterAccessLevelModule; @Setter(AccessLevel.MODULE) - private String ignored14; + private String ignoredSetterAccessLevelModule; + } diff --git a/spring-boot-tools/spring-boot-configuration-processor/src/test/java/org/springframework/boot/configurationsample/lombok/LombokAccessLevelOverwriteDefaultProperties.java b/spring-boot-tools/spring-boot-configuration-processor/src/test/java/org/springframework/boot/configurationsample/lombok/LombokAccessLevelOverwriteDefaultProperties.java index d98f29bf3af..cd67459cf53 100644 --- a/spring-boot-tools/spring-boot-configuration-processor/src/test/java/org/springframework/boot/configurationsample/lombok/LombokAccessLevelOverwriteDefaultProperties.java +++ b/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"); * you may not use this file except in compliance with the License. @@ -60,63 +60,34 @@ public class LombokAccessLevelOverwriteDefaultProperties { */ @Getter(AccessLevel.NONE) @Setter(AccessLevel.NONE) - private String ignored0; - - @Getter(AccessLevel.NONE) - private String ignored1; - - @Setter(AccessLevel.NONE) - private String ignored2; + private String ignoredAccessLevelNone; /* * AccessLevel.PRIVATE */ @Getter(AccessLevel.PRIVATE) @Setter(AccessLevel.PRIVATE) - private String ignored3; - - @Getter(AccessLevel.PRIVATE) - private String ignored4; - - @Setter(AccessLevel.PRIVATE) - private String ignored5; + private String ignoredAccessLevelPrivate; /* * AccessLevel.PACKAGE */ @Getter(AccessLevel.PACKAGE) @Setter(AccessLevel.PACKAGE) - private String ignored6; - - @Getter(AccessLevel.PACKAGE) - private String ignored7; - - @Setter(AccessLevel.PACKAGE) - private String ignored8; + private String ignoredAccessLevelPackage; /* * AccessLevel.PROTECTED */ @Getter(AccessLevel.PROTECTED) @Setter(AccessLevel.PROTECTED) - private String ignored9; - - @Getter(AccessLevel.PROTECTED) - private String ignored10; - - @Setter(AccessLevel.PROTECTED) - private String ignored11; + private String ignoredAccessLevelProtected; /* * AccessLevel.MODULE */ @Getter(AccessLevel.MODULE) @Setter(AccessLevel.MODULE) - private String ignored12; - - @Getter(AccessLevel.MODULE) - private String ignored13; + private String ignoredAccessLevelModule; - @Setter(AccessLevel.MODULE) - private String ignored14; } diff --git a/spring-boot-tools/spring-boot-configuration-processor/src/test/java/org/springframework/boot/configurationsample/lombok/LombokAccessLevelOverwriteExplicitProperties.java b/spring-boot-tools/spring-boot-configuration-processor/src/test/java/org/springframework/boot/configurationsample/lombok/LombokAccessLevelOverwriteExplicitProperties.java index a0c22ddf3f0..4a19f290f1b 100644 --- a/spring-boot-tools/spring-boot-configuration-processor/src/test/java/org/springframework/boot/configurationsample/lombok/LombokAccessLevelOverwriteExplicitProperties.java +++ b/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"); * you may not use this file except in compliance with the License. @@ -60,63 +60,34 @@ public class LombokAccessLevelOverwriteExplicitProperties { */ @Getter(AccessLevel.NONE) @Setter(AccessLevel.NONE) - private String ignored0; - - @Getter(AccessLevel.NONE) - private String ignored1; - - @Setter(AccessLevel.NONE) - private String ignored2; + private String ignoredAccessLevelNone; /* * AccessLevel.PRIVATE */ @Getter(AccessLevel.PRIVATE) @Setter(AccessLevel.PRIVATE) - private String ignored3; - - @Getter(AccessLevel.PRIVATE) - private String ignored4; - - @Setter(AccessLevel.PRIVATE) - private String ignored5; + private String ignoredAccessLevelPrivate; /* * AccessLevel.PACKAGE */ @Getter(AccessLevel.PACKAGE) @Setter(AccessLevel.PACKAGE) - private String ignored6; - - @Getter(AccessLevel.PACKAGE) - private String ignored7; - - @Setter(AccessLevel.PACKAGE) - private String ignored8; + private String ignoredAccessLevelPackage; /* * AccessLevel.PROTECTED */ @Getter(AccessLevel.PROTECTED) @Setter(AccessLevel.PROTECTED) - private String ignored9; - - @Getter(AccessLevel.PROTECTED) - private String ignored10; - - @Setter(AccessLevel.PROTECTED) - private String ignored11; + private String ignoredAccessLevelProtected; /* * AccessLevel.MODULE */ @Getter(AccessLevel.MODULE) @Setter(AccessLevel.MODULE) - private String ignored12; - - @Getter(AccessLevel.MODULE) - private String ignored13; + private String ignoredAccessLevelModule; - @Setter(AccessLevel.MODULE) - private String ignored14; } diff --git a/spring-boot-tools/spring-boot-configuration-processor/src/test/java/org/springframework/boot/configurationsample/lombok/LombokAccessLevelProperties.java b/spring-boot-tools/spring-boot-configuration-processor/src/test/java/org/springframework/boot/configurationsample/lombok/LombokAccessLevelProperties.java index 0fbf3174488..6063ce92edf 100644 --- a/spring-boot-tools/spring-boot-configuration-processor/src/test/java/org/springframework/boot/configurationsample/lombok/LombokAccessLevelProperties.java +++ b/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"); * you may not use this file except in compliance with the License. @@ -43,86 +43,43 @@ public class LombokAccessLevelProperties { */ @Getter(AccessLevel.NONE) @Setter(AccessLevel.NONE) - private String ignored0; - - @Getter(AccessLevel.NONE) - private String ignored1; - - @Setter(AccessLevel.NONE) - private String ignored2; + private String ignoredAccessLevelNone; /* * AccessLevel.PRIVATE */ @Getter(AccessLevel.PRIVATE) @Setter(AccessLevel.PRIVATE) - private String ignored3; - - @Getter(AccessLevel.PRIVATE) - private String ignored4; - - @Setter(AccessLevel.PRIVATE) - private String ignored5; + private String ignoredAccessLevelPrivate; /* * AccessLevel.PACKAGE */ @Getter(AccessLevel.PACKAGE) @Setter(AccessLevel.PACKAGE) - private String ignored6; - - @Getter(AccessLevel.PACKAGE) - private String ignored7; - - @Setter(AccessLevel.PACKAGE) - private String ignored8; + private String ignoredAccessLevelPackage; /* * AccessLevel.PROTECTED */ @Getter(AccessLevel.PROTECTED) @Setter(AccessLevel.PROTECTED) - private String ignored9; - - @Getter(AccessLevel.PROTECTED) - private String ignored10; - - @Setter(AccessLevel.PROTECTED) - private String ignored11; + private String ignoredAccessLevelProtected; /* * AccessLevel.MODULE */ @Getter(AccessLevel.MODULE) @Setter(AccessLevel.MODULE) - private String ignored12; - - @Getter(AccessLevel.MODULE) - private String ignored13; - - @Setter(AccessLevel.MODULE) - private String ignored14; - - /* - * Nor getter neither setter defined - */ - private String ignored15; + private String ignoredAccessLevelModule; /* * Either PUBLIC getter or setter explicitly defined */ @Getter(AccessLevel.PUBLIC) - private String ignored16; + private String ignoredOnlyPublicGetter; @Setter(AccessLevel.PUBLIC) - private String ignored17; + private String ignoredOnlyPublicSetter; - /* - * Either PUBLIC getter or setter implicitly defined - */ - @Getter - private String ignored18; - - @Setter - private String ignored19; } diff --git a/spring-boot-tools/spring-boot-configuration-processor/src/test/java/org/springframework/boot/configurationsample/lombok/LombokExplicitProperties.java b/spring-boot-tools/spring-boot-configuration-processor/src/test/java/org/springframework/boot/configurationsample/lombok/LombokExplicitProperties.java index b0140167158..92839dbe642 100644 --- a/spring-boot-tools/spring-boot-configuration-processor/src/test/java/org/springframework/boot/configurationsample/lombok/LombokExplicitProperties.java +++ b/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") private String ignored; + @Getter + private String ignoredOnlyGetter; + + @Setter + private String ignoredOnlySetter; + }