From 3699132cf0d14d5eb87dcc9684bc3765337f54c6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jonas=20Ke=C3=9Fler?= Date: Tue, 15 May 2018 16:38:30 +0200 Subject: [PATCH 1/2] Respect lombok.AccessLevel attributes See gh-13175 --- ...figurationMetadataAnnotationProcessor.java | 37 ++++- ...ationMetadataAnnotationProcessorTests.java | 60 +++++++- ...bokAccessLevelOverwriteDataProperties.java | 122 +++++++++++++++++ ...AccessLevelOverwriteDefaultProperties.java | 122 +++++++++++++++++ ...ccessLevelOverwriteExplicitProperties.java | 122 +++++++++++++++++ .../lombok/LombokAccessLevelProperties.java | 128 ++++++++++++++++++ 6 files changed, 584 insertions(+), 7 deletions(-) create mode 100644 spring-boot-tools/spring-boot-configuration-processor/src/test/java/org/springframework/boot/configurationsample/lombok/LombokAccessLevelOverwriteDataProperties.java create mode 100644 spring-boot-tools/spring-boot-configuration-processor/src/test/java/org/springframework/boot/configurationsample/lombok/LombokAccessLevelOverwriteDefaultProperties.java create mode 100644 spring-boot-tools/spring-boot-configuration-processor/src/test/java/org/springframework/boot/configurationsample/lombok/LombokAccessLevelOverwriteExplicitProperties.java create mode 100644 spring-boot-tools/spring-boot-configuration-processor/src/test/java/org/springframework/boot/configurationsample/lombok/LombokAccessLevelProperties.java 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 14bb80f92d1..001bdf6d65c 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 @@ -56,6 +56,7 @@ import org.springframework.boot.configurationprocessor.metadata.ItemMetadata; * @author Stephane Nicoll * @author Phillip Webb * @author Kris De Volder + * @author Jonas Keßler * @since 1.2.0 */ @SupportedAnnotationTypes({ "*" }) @@ -76,6 +77,11 @@ 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"; + private MetadataStore metadataStore; private MetadataCollector metadataCollector; @@ -302,16 +308,35 @@ public class ConfigurationMetadataAnnotationProcessor extends AbstractProcessor } private boolean isLombokField(VariableElement field, TypeElement element) { - return hasAnnotation(field, LOMBOK_GETTER_ANNOTATION) - || hasAnnotation(element, LOMBOK_GETTER_ANNOTATION) - || hasAnnotation(element, LOMBOK_DATA_ANNOTATION); + return hasLombokPublicMethod(field, element, LOMBOK_GETTER_ANNOTATION); } private boolean hasLombokSetter(VariableElement field, TypeElement element) { return !field.getModifiers().contains(Modifier.FINAL) - && (hasAnnotation(field, LOMBOK_SETTER_ANNOTATION) - || hasAnnotation(element, LOMBOK_SETTER_ANNOTATION) - || hasAnnotation(element, LOMBOK_DATA_ANNOTATION)); + && hasLombokPublicMethod(field, element, LOMBOK_SETTER_ANNOTATION); + } + + private boolean hasLombokPublicMethod(VariableElement field, TypeElement element, + String lombokMethodAnnotation) { + AnnotationMirror lombokMethodAnnotationOnField = getAnnotation(field, + lombokMethodAnnotation); + if (lombokMethodAnnotationOnField != null) { + return isLombokPublic(lombokMethodAnnotationOnField); + } + + AnnotationMirror lombokMethodAnnotationOnElement = getAnnotation(element, + lombokMethodAnnotation); + if (lombokMethodAnnotationOnElement != null) { + return isLombokPublic(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 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 9cfacf15652..df3f6b5c6dd 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 @@ -38,6 +38,10 @@ import org.springframework.boot.configurationprocessor.metadata.TestJsonConverte import org.springframework.boot.configurationsample.incremental.BarProperties; import org.springframework.boot.configurationsample.incremental.FooProperties; import org.springframework.boot.configurationsample.incremental.RenamedBarProperties; +import org.springframework.boot.configurationsample.lombok.LombokAccessLevelOverwriteDataProperties; +import org.springframework.boot.configurationsample.lombok.LombokAccessLevelOverwriteDefaultProperties; +import org.springframework.boot.configurationsample.lombok.LombokAccessLevelOverwriteExplicitProperties; +import org.springframework.boot.configurationsample.lombok.LombokAccessLevelProperties; import org.springframework.boot.configurationsample.lombok.LombokExplicitProperties; import org.springframework.boot.configurationsample.lombok.LombokInnerClassProperties; import org.springframework.boot.configurationsample.lombok.LombokInnerClassWithGetterProperties; @@ -83,6 +87,7 @@ import static org.assertj.core.api.Assertions.assertThat; * @author Phillip Webb * @author Andy Wilkinson * @author Kris De Volder + * @author Jonas Keßler */ public class ConfigurationMetadataAnnotationProcessorTests { @@ -483,6 +488,40 @@ public class ConfigurationMetadataAnnotationProcessorTests { assertSimpleLombokProperties(metadata, LombokSimpleProperties.class, "simple"); } + @Test + public void lombokAccessLevelOverwriteDataProperties() { + ConfigurationMetadata metadata = compile( + LombokAccessLevelOverwriteDataProperties.class); + assertAccessLevelOverwriteLombokProperties(metadata, + LombokAccessLevelOverwriteDataProperties.class, + "accesslevel.overwrite.data"); + } + + @Test + public void lombokAccessLevelOverwriteExplicitProperties() { + ConfigurationMetadata metadata = compile( + LombokAccessLevelOverwriteExplicitProperties.class); + assertAccessLevelOverwriteLombokProperties(metadata, + LombokAccessLevelOverwriteExplicitProperties.class, + "accesslevel.overwrite.explicit"); + } + + @Test + public void lombokAccessLevelOverwriteDefaultProperties() { + ConfigurationMetadata metadata = compile( + LombokAccessLevelOverwriteDefaultProperties.class); + assertAccessLevelOverwriteLombokProperties(metadata, + LombokAccessLevelOverwriteDefaultProperties.class, + "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); @@ -789,7 +828,26 @@ public class ConfigurationMetadataAnnotationProcessorTests { assertThat(metadata).doesNotHave(Metadata.withProperty(prefix + ".ignored")); } - private ConfigurationMetadata compile(Class... types) throws IOException { + private void assertAccessLevelOverwriteLombokProperties( + ConfigurationMetadata metadata, Class source, String prefix) { + assertAccessLevelLombokProperties(metadata, source, prefix, 7, 15); + } + + private void assertAccessLevelLombokProperties(ConfigurationMetadata metadata, + Class source, String prefix, int countNameFields, int countIgnoredFields) { + 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)); + } + } + + private ConfigurationMetadata compile(Class... types) { TestConfigurationMetadataAnnotationProcessor processor = new TestConfigurationMetadataAnnotationProcessor( this.compiler.getOutputLocation()); this.compiler.getTask(types).call(processor); 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 new file mode 100644 index 00000000000..f8eeeb5b3df --- /dev/null +++ b/spring-boot-tools/spring-boot-configuration-processor/src/test/java/org/springframework/boot/configurationsample/lombok/LombokAccessLevelOverwriteDataProperties.java @@ -0,0 +1,122 @@ +/* + * 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.lombok; + +import lombok.AccessLevel; +import lombok.Data; +import lombok.Getter; +import lombok.Setter; + +import org.springframework.boot.configurationsample.ConfigurationProperties; + +/** + * Configuration properties using lombok @Data on element level and overwriting behaviour + * with @Getter und @Setter at field level. + * + * @author Jonas Keßler + */ +@Data +@ConfigurationProperties(prefix = "accesslevel.overwrite.data") +public class LombokAccessLevelOverwriteDataProperties { + + private String name0; + + @Getter(AccessLevel.PUBLIC) + @Setter(AccessLevel.PUBLIC) + private String name1; + + @Getter(AccessLevel.PUBLIC) + private String name2; + + @Setter(AccessLevel.PUBLIC) + private String name3; + + @Getter + @Setter + private String name4; + + @Getter + private String name5; + + @Setter + private String name6; + + /* + * AccessLevel.NONE + */ + @Getter(AccessLevel.NONE) + @Setter(AccessLevel.NONE) + private String ignored0; + + @Getter(AccessLevel.NONE) + private String ignored1; + + @Setter(AccessLevel.NONE) + private String ignored2; + + /* + * AccessLevel.PRIVATE + */ + @Getter(AccessLevel.PRIVATE) + @Setter(AccessLevel.PRIVATE) + private String ignored3; + + @Getter(AccessLevel.PRIVATE) + private String ignored4; + + @Setter(AccessLevel.PRIVATE) + private String ignored5; + + /* + * AccessLevel.PACKAGE + */ + @Getter(AccessLevel.PACKAGE) + @Setter(AccessLevel.PACKAGE) + private String ignored6; + + @Getter(AccessLevel.PACKAGE) + private String ignored7; + + @Setter(AccessLevel.PACKAGE) + private String ignored8; + + /* + * AccessLevel.PROTECTED + */ + @Getter(AccessLevel.PROTECTED) + @Setter(AccessLevel.PROTECTED) + private String ignored9; + + @Getter(AccessLevel.PROTECTED) + private String ignored10; + + @Setter(AccessLevel.PROTECTED) + private String ignored11; + + /* + * AccessLevel.MODULE + */ + @Getter(AccessLevel.MODULE) + @Setter(AccessLevel.MODULE) + private String ignored12; + + @Getter(AccessLevel.MODULE) + private String ignored13; + + @Setter(AccessLevel.MODULE) + private String ignored14; +} 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 new file mode 100644 index 00000000000..d98f29bf3af --- /dev/null +++ b/spring-boot-tools/spring-boot-configuration-processor/src/test/java/org/springframework/boot/configurationsample/lombok/LombokAccessLevelOverwriteDefaultProperties.java @@ -0,0 +1,122 @@ +/* + * 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.lombok; + +import lombok.AccessLevel; +import lombok.Getter; +import lombok.Setter; + +import org.springframework.boot.configurationsample.ConfigurationProperties; + +/** + * Configuration properties using lombok @Getter and @Setter without explicitly defining + * AccessLevel on element level and overwriting behaviour at field level. + * + * @author Jonas Keßler + */ +@Getter +@Setter +@ConfigurationProperties(prefix = "accesslevel.overwrite.default") +public class LombokAccessLevelOverwriteDefaultProperties { + + private String name0; + + @Getter(AccessLevel.PUBLIC) + @Setter(AccessLevel.PUBLIC) + private String name1; + + @Getter(AccessLevel.PUBLIC) + private String name2; + + @Setter(AccessLevel.PUBLIC) + private String name3; + + @Getter + @Setter + private String name4; + + @Getter + private String name5; + + @Setter + private String name6; + + /* + * AccessLevel.NONE + */ + @Getter(AccessLevel.NONE) + @Setter(AccessLevel.NONE) + private String ignored0; + + @Getter(AccessLevel.NONE) + private String ignored1; + + @Setter(AccessLevel.NONE) + private String ignored2; + + /* + * AccessLevel.PRIVATE + */ + @Getter(AccessLevel.PRIVATE) + @Setter(AccessLevel.PRIVATE) + private String ignored3; + + @Getter(AccessLevel.PRIVATE) + private String ignored4; + + @Setter(AccessLevel.PRIVATE) + private String ignored5; + + /* + * AccessLevel.PACKAGE + */ + @Getter(AccessLevel.PACKAGE) + @Setter(AccessLevel.PACKAGE) + private String ignored6; + + @Getter(AccessLevel.PACKAGE) + private String ignored7; + + @Setter(AccessLevel.PACKAGE) + private String ignored8; + + /* + * AccessLevel.PROTECTED + */ + @Getter(AccessLevel.PROTECTED) + @Setter(AccessLevel.PROTECTED) + private String ignored9; + + @Getter(AccessLevel.PROTECTED) + private String ignored10; + + @Setter(AccessLevel.PROTECTED) + private String ignored11; + + /* + * AccessLevel.MODULE + */ + @Getter(AccessLevel.MODULE) + @Setter(AccessLevel.MODULE) + private String ignored12; + + @Getter(AccessLevel.MODULE) + private String ignored13; + + @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 new file mode 100644 index 00000000000..a0c22ddf3f0 --- /dev/null +++ b/spring-boot-tools/spring-boot-configuration-processor/src/test/java/org/springframework/boot/configurationsample/lombok/LombokAccessLevelOverwriteExplicitProperties.java @@ -0,0 +1,122 @@ +/* + * 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.lombok; + +import lombok.AccessLevel; +import lombok.Getter; +import lombok.Setter; + +import org.springframework.boot.configurationsample.ConfigurationProperties; + +/** + * Configuration properties using lombok @Getter and @Setter with explicitly defining + * AccessLevel.PUBLIC on element level and overwriting behaviour at field level. + * + * @author Jonas Keßler + */ +@Getter(AccessLevel.PUBLIC) +@Setter(AccessLevel.PUBLIC) +@ConfigurationProperties(prefix = "accesslevel.overwrite.explicit") +public class LombokAccessLevelOverwriteExplicitProperties { + + private String name0; + + @Getter(AccessLevel.PUBLIC) + @Setter(AccessLevel.PUBLIC) + private String name1; + + @Getter(AccessLevel.PUBLIC) + private String name2; + + @Setter(AccessLevel.PUBLIC) + private String name3; + + @Getter + @Setter + private String name4; + + @Getter + private String name5; + + @Setter + private String name6; + + /* + * AccessLevel.NONE + */ + @Getter(AccessLevel.NONE) + @Setter(AccessLevel.NONE) + private String ignored0; + + @Getter(AccessLevel.NONE) + private String ignored1; + + @Setter(AccessLevel.NONE) + private String ignored2; + + /* + * AccessLevel.PRIVATE + */ + @Getter(AccessLevel.PRIVATE) + @Setter(AccessLevel.PRIVATE) + private String ignored3; + + @Getter(AccessLevel.PRIVATE) + private String ignored4; + + @Setter(AccessLevel.PRIVATE) + private String ignored5; + + /* + * AccessLevel.PACKAGE + */ + @Getter(AccessLevel.PACKAGE) + @Setter(AccessLevel.PACKAGE) + private String ignored6; + + @Getter(AccessLevel.PACKAGE) + private String ignored7; + + @Setter(AccessLevel.PACKAGE) + private String ignored8; + + /* + * AccessLevel.PROTECTED + */ + @Getter(AccessLevel.PROTECTED) + @Setter(AccessLevel.PROTECTED) + private String ignored9; + + @Getter(AccessLevel.PROTECTED) + private String ignored10; + + @Setter(AccessLevel.PROTECTED) + private String ignored11; + + /* + * AccessLevel.MODULE + */ + @Getter(AccessLevel.MODULE) + @Setter(AccessLevel.MODULE) + private String ignored12; + + @Getter(AccessLevel.MODULE) + private String ignored13; + + @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 new file mode 100644 index 00000000000..0fbf3174488 --- /dev/null +++ b/spring-boot-tools/spring-boot-configuration-processor/src/test/java/org/springframework/boot/configurationsample/lombok/LombokAccessLevelProperties.java @@ -0,0 +1,128 @@ +/* + * 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.lombok; + +import lombok.AccessLevel; +import lombok.Getter; +import lombok.Setter; + +import org.springframework.boot.configurationsample.ConfigurationProperties; + +/** + * Configuration properties without lombok annotations at element level. + * + * @author Jonas Keßler + */ +@ConfigurationProperties(prefix = "accesslevel") +public class LombokAccessLevelProperties { + + @Getter(AccessLevel.PUBLIC) + @Setter(AccessLevel.PUBLIC) + private String name0; + + @Getter + @Setter + private String name1; + + /* + * AccessLevel.NONE + */ + @Getter(AccessLevel.NONE) + @Setter(AccessLevel.NONE) + private String ignored0; + + @Getter(AccessLevel.NONE) + private String ignored1; + + @Setter(AccessLevel.NONE) + private String ignored2; + + /* + * AccessLevel.PRIVATE + */ + @Getter(AccessLevel.PRIVATE) + @Setter(AccessLevel.PRIVATE) + private String ignored3; + + @Getter(AccessLevel.PRIVATE) + private String ignored4; + + @Setter(AccessLevel.PRIVATE) + private String ignored5; + + /* + * AccessLevel.PACKAGE + */ + @Getter(AccessLevel.PACKAGE) + @Setter(AccessLevel.PACKAGE) + private String ignored6; + + @Getter(AccessLevel.PACKAGE) + private String ignored7; + + @Setter(AccessLevel.PACKAGE) + private String ignored8; + + /* + * AccessLevel.PROTECTED + */ + @Getter(AccessLevel.PROTECTED) + @Setter(AccessLevel.PROTECTED) + private String ignored9; + + @Getter(AccessLevel.PROTECTED) + private String ignored10; + + @Setter(AccessLevel.PROTECTED) + private String ignored11; + + /* + * 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; + + /* + * Either PUBLIC getter or setter explicitly defined + */ + @Getter(AccessLevel.PUBLIC) + private String ignored16; + + @Setter(AccessLevel.PUBLIC) + private String ignored17; + + /* + * Either PUBLIC getter or setter implicitly defined + */ + @Getter + private String ignored18; + + @Setter + private String ignored19; +} From 563d7d70a23a318959cd162b6480b8f31befd531 Mon Sep 17 00:00:00 2001 From: Stephane Nicoll Date: Wed, 16 May 2018 12:57:54 +0200 Subject: [PATCH 2/2] Polish "Respect lombok.AccessLevel attributes" Closes gh-13175 --- ...figurationMetadataAnnotationProcessor.java | 44 ++++++++------ ...ationMetadataAnnotationProcessorTests.java | 39 ++++++------ ...bokAccessLevelOverwriteDataProperties.java | 31 +++++----- ...AccessLevelOverwriteDefaultProperties.java | 41 ++----------- ...ccessLevelOverwriteExplicitProperties.java | 41 ++----------- .../lombok/LombokAccessLevelProperties.java | 59 +++---------------- .../lombok/LombokExplicitProperties.java | 6 ++ 7 files changed, 85 insertions(+), 176 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); + && hasLombokPublicAccessor(field, element, false); } - private boolean hasLombokPublicMethod(VariableElement field, TypeElement element, - String lombokMethodAnnotation) { - AnnotationMirror lombokMethodAnnotationOnField = getAnnotation(field, - lombokMethodAnnotation); + /** + * 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; + private String ignoredAccessLevelModule; - @Getter(AccessLevel.MODULE) - private String ignored13; - - @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; + private String ignoredAccessLevelModule; - @Getter(AccessLevel.MODULE) - private String ignored13; - - @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; + }