Revert "Support constructor binding on 3rd party classes"
This commit reverts the support of constructor binding on 3rd party classes using @ImportConfigurationPropertiesBean See gh-23172 Closes gh-23593
This commit is contained in:
@@ -22,7 +22,6 @@ import java.io.StringWriter;
|
||||
import java.time.Duration;
|
||||
import java.util.Collections;
|
||||
import java.util.LinkedHashMap;
|
||||
import java.util.LinkedHashSet;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Set;
|
||||
@@ -41,7 +40,6 @@ import javax.lang.model.element.Modifier;
|
||||
import javax.lang.model.element.TypeElement;
|
||||
import javax.lang.model.element.VariableElement;
|
||||
import javax.lang.model.type.TypeKind;
|
||||
import javax.lang.model.type.TypeMirror;
|
||||
import javax.lang.model.util.ElementFilter;
|
||||
import javax.tools.Diagnostic.Kind;
|
||||
|
||||
@@ -82,10 +80,6 @@ public class ConfigurationMetadataAnnotationProcessor extends AbstractProcessor
|
||||
|
||||
static final String NAME_ANNOTATION = "org.springframework.boot.context.properties.bind.Name";
|
||||
|
||||
static final String IMPORT_AS_CONFIGURATION_PROPERTIES_BEAN_ANNOATION = "org.springframework.boot.context.properties.ImportAsConfigurationPropertiesBean";
|
||||
|
||||
static final String IMPORT_AS_CONFIGURATION_PROPERTIES_BEANS_ANNOATION = "org.springframework.boot.context.properties.ImportAsConfigurationPropertiesBeans";
|
||||
|
||||
private static final Set<String> SUPPORTED_OPTIONS = Collections
|
||||
.unmodifiableSet(Collections.singleton(ADDITIONAL_METADATA_LOCATIONS_OPTION));
|
||||
|
||||
@@ -127,14 +121,6 @@ public class ConfigurationMetadataAnnotationProcessor extends AbstractProcessor
|
||||
return NAME_ANNOTATION;
|
||||
}
|
||||
|
||||
protected String importAsConfigurationPropertiesBeanAnnotation() {
|
||||
return IMPORT_AS_CONFIGURATION_PROPERTIES_BEAN_ANNOATION;
|
||||
}
|
||||
|
||||
protected String importAsConfigurationPropertiesBeansAnnotation() {
|
||||
return IMPORT_AS_CONFIGURATION_PROPERTIES_BEANS_ANNOATION;
|
||||
}
|
||||
|
||||
@Override
|
||||
public SourceVersion getSupportedSourceVersion() {
|
||||
return SourceVersion.latestSupported();
|
||||
@@ -153,16 +139,22 @@ public class ConfigurationMetadataAnnotationProcessor extends AbstractProcessor
|
||||
this.metadataEnv = new MetadataGenerationEnvironment(env, configurationPropertiesAnnotation(),
|
||||
nestedConfigurationPropertyAnnotation(), deprecatedConfigurationPropertyAnnotation(),
|
||||
constructorBindingAnnotation(), defaultValueAnnotation(), endpointAnnotation(),
|
||||
readOperationAnnotation(), nameAnnotation(), importAsConfigurationPropertiesBeanAnnotation(),
|
||||
importAsConfigurationPropertiesBeansAnnotation());
|
||||
readOperationAnnotation(), nameAnnotation());
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean process(Set<? extends TypeElement> annotations, RoundEnvironment roundEnv) {
|
||||
this.metadataCollector.processing(roundEnv);
|
||||
processConfigurationProperties(roundEnv);
|
||||
processEndpoint(roundEnv);
|
||||
processImportAsConfigurationProperties(roundEnv);
|
||||
TypeElement annotationType = this.metadataEnv.getConfigurationPropertiesAnnotationElement();
|
||||
if (annotationType != null) { // Is @ConfigurationProperties available
|
||||
for (Element element : roundEnv.getElementsAnnotatedWith(annotationType)) {
|
||||
processElement(element);
|
||||
}
|
||||
}
|
||||
TypeElement endpointType = this.metadataEnv.getEndpointAnnotationElement();
|
||||
if (endpointType != null) { // Is @Endpoint available
|
||||
getElementsAnnotatedOrMetaAnnotatedWith(roundEnv, endpointType).forEach(this::processEndpoint);
|
||||
}
|
||||
if (roundEnv.processingOver()) {
|
||||
try {
|
||||
writeMetaData();
|
||||
@@ -174,40 +166,6 @@ public class ConfigurationMetadataAnnotationProcessor extends AbstractProcessor
|
||||
return false;
|
||||
}
|
||||
|
||||
private void processConfigurationProperties(RoundEnvironment roundEnv) {
|
||||
TypeElement annotationType = this.metadataEnv.getConfigurationPropertiesAnnotationElement();
|
||||
if (annotationType != null) {
|
||||
for (Element element : roundEnv.getElementsAnnotatedWith(annotationType)) {
|
||||
processElement(element);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void processEndpoint(RoundEnvironment roundEnv) {
|
||||
TypeElement endpointType = this.metadataEnv.getEndpointAnnotationElement();
|
||||
if (endpointType != null) {
|
||||
getElementsAnnotatedOrMetaAnnotatedWith(roundEnv, endpointType).forEach(this::processEndpoint);
|
||||
}
|
||||
}
|
||||
|
||||
private void processImportAsConfigurationProperties(RoundEnvironment roundEnv) {
|
||||
TypeElement importAsConfigurationPropertiesBeanType = this.metadataEnv
|
||||
.getImportAsConfigurationPropertiesBeansAnnotation();
|
||||
TypeElement importAsConfigurationPropertiesBeansType = this.metadataEnv
|
||||
.getImportAsConfigurationPropertiesBeansAnnotationElement();
|
||||
if (importAsConfigurationPropertiesBeanType == null && importAsConfigurationPropertiesBeansType == null) {
|
||||
return;
|
||||
}
|
||||
Set<Element> elements = new LinkedHashSet<>();
|
||||
if (importAsConfigurationPropertiesBeanType != null) {
|
||||
elements.addAll(roundEnv.getElementsAnnotatedWith(importAsConfigurationPropertiesBeanType));
|
||||
}
|
||||
if (importAsConfigurationPropertiesBeansType != null) {
|
||||
elements.addAll(roundEnv.getElementsAnnotatedWith(importAsConfigurationPropertiesBeansType));
|
||||
}
|
||||
elements.forEach(this::processImportAsConfigurationPropertiesBean);
|
||||
}
|
||||
|
||||
private Map<Element, List<Element>> getElementsAnnotatedOrMetaAnnotatedWith(RoundEnvironment roundEnv,
|
||||
TypeElement annotation) {
|
||||
Map<Element, List<Element>> result = new LinkedHashMap<>();
|
||||
@@ -226,7 +184,7 @@ public class ConfigurationMetadataAnnotationProcessor extends AbstractProcessor
|
||||
if (annotation != null) {
|
||||
String prefix = getPrefix(annotation);
|
||||
if (element instanceof TypeElement) {
|
||||
processAnnotatedTypeElement(prefix, (TypeElement) element, false, new Stack<>());
|
||||
processAnnotatedTypeElement(prefix, (TypeElement) element, new Stack<>());
|
||||
}
|
||||
else if (element instanceof ExecutableElement) {
|
||||
processExecutableElement(prefix, (ExecutableElement) element, new Stack<>());
|
||||
@@ -238,11 +196,10 @@ public class ConfigurationMetadataAnnotationProcessor extends AbstractProcessor
|
||||
}
|
||||
}
|
||||
|
||||
private void processAnnotatedTypeElement(String prefix, TypeElement element, boolean fromImport,
|
||||
Stack<TypeElement> seen) {
|
||||
private void processAnnotatedTypeElement(String prefix, TypeElement element, Stack<TypeElement> seen) {
|
||||
String type = this.metadataEnv.getTypeUtils().getQualifiedName(element);
|
||||
this.metadataCollector.add(ItemMetadata.newGroup(prefix, type, type, null));
|
||||
processTypeElement(prefix, element, fromImport, null, seen);
|
||||
processTypeElement(prefix, element, null, seen);
|
||||
}
|
||||
|
||||
private void processExecutableElement(String prefix, ExecutableElement element, Stack<TypeElement> seen) {
|
||||
@@ -260,26 +217,25 @@ public class ConfigurationMetadataAnnotationProcessor extends AbstractProcessor
|
||||
}
|
||||
else {
|
||||
this.metadataCollector.add(group);
|
||||
processTypeElement(prefix, (TypeElement) returns, false, element, seen);
|
||||
processTypeElement(prefix, (TypeElement) returns, element, seen);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void processTypeElement(String prefix, TypeElement element, boolean fromImport, ExecutableElement source,
|
||||
private void processTypeElement(String prefix, TypeElement element, ExecutableElement source,
|
||||
Stack<TypeElement> seen) {
|
||||
if (!seen.contains(element)) {
|
||||
seen.push(element);
|
||||
new PropertyDescriptorResolver(this.metadataEnv).resolve(element, fromImport, source)
|
||||
.forEach((descriptor) -> {
|
||||
this.metadataCollector.add(descriptor.resolveItemMetadata(prefix, this.metadataEnv));
|
||||
if (descriptor.isNested(this.metadataEnv)) {
|
||||
TypeElement nestedTypeElement = (TypeElement) this.metadataEnv.getTypeUtils()
|
||||
.asElement(descriptor.getType());
|
||||
String nestedPrefix = ConfigurationMetadata.nestedPrefix(prefix, descriptor.getName());
|
||||
processTypeElement(nestedPrefix, nestedTypeElement, false, source, seen);
|
||||
}
|
||||
});
|
||||
new PropertyDescriptorResolver(this.metadataEnv).resolve(element, source).forEach((descriptor) -> {
|
||||
this.metadataCollector.add(descriptor.resolveItemMetadata(prefix, this.metadataEnv));
|
||||
if (descriptor.isNested(this.metadataEnv)) {
|
||||
TypeElement nestedTypeElement = (TypeElement) this.metadataEnv.getTypeUtils()
|
||||
.asElement(descriptor.getType());
|
||||
String nestedPrefix = ConfigurationMetadata.nestedPrefix(prefix, descriptor.getName());
|
||||
processTypeElement(nestedPrefix, nestedTypeElement, source, seen);
|
||||
}
|
||||
});
|
||||
seen.pop();
|
||||
}
|
||||
}
|
||||
@@ -316,31 +272,6 @@ public class ConfigurationMetadataAnnotationProcessor extends AbstractProcessor
|
||||
}
|
||||
}
|
||||
|
||||
private void processImportAsConfigurationPropertiesBean(Element element) {
|
||||
this.metadataEnv.getImportAsConfigurationPropertiesBeanAnnotations(element)
|
||||
.forEach(this::processImportAsConfigurationPropertiesBean);
|
||||
}
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
private void processImportAsConfigurationPropertiesBean(AnnotationMirror annotation) {
|
||||
String prefix = getPrefix(annotation);
|
||||
processImportAsConfigurationPropertiesBeanTypes(prefix,
|
||||
(List<TypeMirror>) this.metadataEnv.getAnnotationElementValues(annotation).get("type"));
|
||||
processImportAsConfigurationPropertiesBeanTypes(prefix,
|
||||
(List<TypeMirror>) this.metadataEnv.getAnnotationElementValues(annotation).get("value"));
|
||||
}
|
||||
|
||||
private void processImportAsConfigurationPropertiesBeanTypes(String prefix, List<TypeMirror> types) {
|
||||
if (types != null) {
|
||||
for (TypeMirror type : types) {
|
||||
Element element = this.metadataEnv.getTypeUtils().asElement(type);
|
||||
AnnotationMirror annotation = this.metadataEnv.getConfigurationPropertiesAnnotation(element);
|
||||
prefix = (annotation != null) ? getPrefix(annotation) : prefix;
|
||||
processAnnotatedTypeElement(prefix, (TypeElement) element, true, new Stack<>());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private boolean hasMainReadOperation(TypeElement element) {
|
||||
for (ExecutableElement method : ElementFilter.methodsIn(element.getEnclosedElements())) {
|
||||
if (this.metadataEnv.getReadOperationAnnotation(method) != null
|
||||
|
||||
@@ -97,15 +97,10 @@ class MetadataGenerationEnvironment {
|
||||
|
||||
private final String nameAnnotation;
|
||||
|
||||
private final String importAsConfigurationPropertiesBeanAnnotation;
|
||||
|
||||
private final String importAsConfigurationPropertiesBeansAnnotation;
|
||||
|
||||
MetadataGenerationEnvironment(ProcessingEnvironment environment, String configurationPropertiesAnnotation,
|
||||
String nestedConfigurationPropertyAnnotation, String deprecatedConfigurationPropertyAnnotation,
|
||||
String constructorBindingAnnotation, String defaultValueAnnotation, String endpointAnnotation,
|
||||
String readOperationAnnotation, String nameAnnotation, String importAsConfigurationPropertiesBeanAnnotation,
|
||||
String importAsConfigurationPropertiesBeansAnnotation) {
|
||||
String readOperationAnnotation, String nameAnnotation) {
|
||||
this.typeUtils = new TypeUtils(environment);
|
||||
this.elements = environment.getElementUtils();
|
||||
this.messager = environment.getMessager();
|
||||
@@ -118,8 +113,6 @@ class MetadataGenerationEnvironment {
|
||||
this.endpointAnnotation = endpointAnnotation;
|
||||
this.readOperationAnnotation = readOperationAnnotation;
|
||||
this.nameAnnotation = nameAnnotation;
|
||||
this.importAsConfigurationPropertiesBeanAnnotation = importAsConfigurationPropertiesBeanAnnotation;
|
||||
this.importAsConfigurationPropertiesBeansAnnotation = importAsConfigurationPropertiesBeansAnnotation;
|
||||
}
|
||||
|
||||
private static FieldValuesParser resolveFieldValuesParser(ProcessingEnvironment env) {
|
||||
@@ -265,14 +258,6 @@ class MetadataGenerationEnvironment {
|
||||
return this.elements.getTypeElement(this.configurationPropertiesAnnotation);
|
||||
}
|
||||
|
||||
TypeElement getImportAsConfigurationPropertiesBeansAnnotation() {
|
||||
return this.elements.getTypeElement(this.importAsConfigurationPropertiesBeanAnnotation);
|
||||
}
|
||||
|
||||
TypeElement getImportAsConfigurationPropertiesBeansAnnotationElement() {
|
||||
return this.elements.getTypeElement(this.importAsConfigurationPropertiesBeansAnnotation);
|
||||
}
|
||||
|
||||
AnnotationMirror getConfigurationPropertiesAnnotation(Element element) {
|
||||
return getAnnotation(element, this.configurationPropertiesAnnotation);
|
||||
}
|
||||
@@ -297,22 +282,6 @@ class MetadataGenerationEnvironment {
|
||||
return getAnnotation(element, this.nameAnnotation);
|
||||
}
|
||||
|
||||
List<AnnotationMirror> getImportAsConfigurationPropertiesBeanAnnotations(Element element) {
|
||||
List<AnnotationMirror> annotations = new ArrayList<>();
|
||||
AnnotationMirror importBean = getAnnotation(element, this.importAsConfigurationPropertiesBeanAnnotation);
|
||||
if (importBean != null) {
|
||||
annotations.add(importBean);
|
||||
}
|
||||
AnnotationMirror importBeans = getAnnotation(element, this.importAsConfigurationPropertiesBeansAnnotation);
|
||||
if (importBeans != null) {
|
||||
AnnotationValue value = importBeans.getElementValues().values().iterator().next();
|
||||
for (Object contained : (List<?>) value.getValue()) {
|
||||
annotations.add((AnnotationMirror) contained);
|
||||
}
|
||||
}
|
||||
return Collections.unmodifiableList(annotations);
|
||||
}
|
||||
|
||||
boolean hasNullableAnnotation(Element element) {
|
||||
return getAnnotation(element, NULLABLE_ANNOTATION) != null;
|
||||
}
|
||||
|
||||
@@ -49,19 +49,16 @@ class PropertyDescriptorResolver {
|
||||
* specified {@link TypeElement type} based on the specified {@link ExecutableElement
|
||||
* factory method}, if any.
|
||||
* @param type the target type
|
||||
* @param fromImport it the type was imported via a
|
||||
* {@code @ImportAsConfigurationPropertiesBean}
|
||||
* @param factoryMethod the method that triggered the metadata for that {@code type}
|
||||
* or {@code null}
|
||||
* @return the candidate properties for metadata generation
|
||||
*/
|
||||
Stream<PropertyDescriptor<?>> resolve(TypeElement type, boolean fromImport, ExecutableElement factoryMethod) {
|
||||
Stream<PropertyDescriptor<?>> resolve(TypeElement type, ExecutableElement factoryMethod) {
|
||||
TypeElementMembers members = new TypeElementMembers(this.environment, type);
|
||||
if (factoryMethod != null) {
|
||||
return resolveJavaBeanProperties(type, factoryMethod, members);
|
||||
}
|
||||
return resolve(ConfigurationPropertiesTypeElement.of(type, fromImport, this.environment), factoryMethod,
|
||||
members);
|
||||
return resolve(ConfigurationPropertiesTypeElement.of(type, this.environment), factoryMethod, members);
|
||||
}
|
||||
|
||||
private Stream<PropertyDescriptor<?>> resolve(ConfigurationPropertiesTypeElement type,
|
||||
@@ -181,29 +178,20 @@ class PropertyDescriptorResolver {
|
||||
return boundConstructor;
|
||||
}
|
||||
|
||||
static ConfigurationPropertiesTypeElement of(TypeElement type, boolean fromImport,
|
||||
MetadataGenerationEnvironment env) {
|
||||
static ConfigurationPropertiesTypeElement of(TypeElement type, MetadataGenerationEnvironment env) {
|
||||
boolean constructorBoundType = isConstructorBoundType(type, env);
|
||||
List<ExecutableElement> constructors = ElementFilter.constructorsIn(type.getEnclosedElements());
|
||||
List<ExecutableElement> boundConstructors = constructors.stream()
|
||||
.filter(env::hasConstructorBindingAnnotation).collect(Collectors.toList());
|
||||
boolean constructorBoundType = isConstructorBoundType(type, fromImport, constructors, env);
|
||||
return new ConfigurationPropertiesTypeElement(type, constructorBoundType, constructors, boundConstructors);
|
||||
}
|
||||
|
||||
private static boolean isConstructorBoundType(TypeElement type, boolean fromImport,
|
||||
List<ExecutableElement> constructors, MetadataGenerationEnvironment env) {
|
||||
private static boolean isConstructorBoundType(TypeElement type, MetadataGenerationEnvironment env) {
|
||||
if (env.hasConstructorBindingAnnotation(type)) {
|
||||
return true;
|
||||
}
|
||||
if (type.getNestingKind() == NestingKind.MEMBER) {
|
||||
return isConstructorBoundType((TypeElement) type.getEnclosingElement(), false, constructors, env);
|
||||
}
|
||||
if (fromImport) {
|
||||
for (ExecutableElement constructor : constructors) {
|
||||
if (!constructor.getParameters().isEmpty()) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return isConstructorBoundType((TypeElement) type.getEnclosingElement(), env);
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
@@ -1,81 +0,0 @@
|
||||
/*
|
||||
* Copyright 2012-2020 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
|
||||
*
|
||||
* https://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;
|
||||
|
||||
import org.junit.jupiter.api.Test;
|
||||
|
||||
import org.springframework.boot.configurationprocessor.metadata.ConfigurationMetadata;
|
||||
import org.springframework.boot.configurationprocessor.metadata.Metadata;
|
||||
import org.springframework.boot.configurationsample.ImportAsConfigurationPropertiesBean;
|
||||
import org.springframework.boot.configurationsample.ImportAsConfigurationPropertiesBeans;
|
||||
import org.springframework.boot.configurationsample.importbean.ImportAnnotatedJavaBean;
|
||||
import org.springframework.boot.configurationsample.importbean.ImportJavaBeanConfigurationPropertiesBean;
|
||||
import org.springframework.boot.configurationsample.importbean.ImportMultipleTypeConfigurationPropertiesBean;
|
||||
import org.springframework.boot.configurationsample.importbean.ImportRepeatedConfigurationPropertiesBean;
|
||||
import org.springframework.boot.configurationsample.importbean.ImportValueObjectConfigurationPropertiesBean;
|
||||
import org.springframework.boot.configurationsample.importbean.ImportedAnnotatedJavaBean;
|
||||
import org.springframework.boot.configurationsample.importbean.ImportedJavaBean;
|
||||
import org.springframework.boot.configurationsample.importbean.ImportedValueObject;
|
||||
|
||||
import static org.assertj.core.api.Assertions.assertThat;
|
||||
|
||||
/**
|
||||
* Tests for {@link ImportAsConfigurationPropertiesBean} and
|
||||
* {@link ImportAsConfigurationPropertiesBeans}.
|
||||
*
|
||||
* @author Phillip Webb
|
||||
*/
|
||||
public class ImportBeanTests extends AbstractMetadataGenerationTests {
|
||||
|
||||
@Test
|
||||
void importValueObjectConfigurationPropertiesBean() {
|
||||
ConfigurationMetadata metadata = compile(ImportValueObjectConfigurationPropertiesBean.class);
|
||||
assertThat(metadata)
|
||||
.has(Metadata.withProperty("importbean.value", String.class).fromSource(ImportedValueObject.class));
|
||||
}
|
||||
|
||||
@Test
|
||||
void importJavaBeanConfigurationPropertiesBean() {
|
||||
ConfigurationMetadata metadata = compile(ImportJavaBeanConfigurationPropertiesBean.class);
|
||||
assertThat(metadata)
|
||||
.has(Metadata.withProperty("importbean.name", String.class).fromSource(ImportedJavaBean.class));
|
||||
}
|
||||
|
||||
@Test
|
||||
void importMultipleTypeConfigurationPropertiesBean() {
|
||||
ConfigurationMetadata metadata = compile(ImportMultipleTypeConfigurationPropertiesBean.class);
|
||||
assertThat(metadata)
|
||||
.has(Metadata.withProperty("importbean.value", String.class).fromSource(ImportedValueObject.class));
|
||||
assertThat(metadata)
|
||||
.has(Metadata.withProperty("importbean.name", String.class).fromSource(ImportedJavaBean.class));
|
||||
}
|
||||
|
||||
@Test
|
||||
void importRepeatedConfigurationPropertiesBean() {
|
||||
ConfigurationMetadata metadata = compile(ImportRepeatedConfigurationPropertiesBean.class);
|
||||
assertThat(metadata).has(Metadata.withProperty("vo.value", String.class).fromSource(ImportedValueObject.class));
|
||||
assertThat(metadata).has(Metadata.withProperty("jb.name", String.class).fromSource(ImportedJavaBean.class));
|
||||
}
|
||||
|
||||
@Test
|
||||
void importAnnotatedJavaBean() {
|
||||
ConfigurationMetadata metadata = compile(ImportAnnotatedJavaBean.class);
|
||||
assertThat(metadata)
|
||||
.has(Metadata.withProperty("test.name", String.class).fromSource(ImportedAnnotatedJavaBean.class));
|
||||
}
|
||||
|
||||
}
|
||||
@@ -39,9 +39,7 @@ class MetadataGenerationEnvironmentFactory implements Function<ProcessingEnviron
|
||||
TestConfigurationMetadataAnnotationProcessor.DEFAULT_VALUE_ANNOTATION,
|
||||
TestConfigurationMetadataAnnotationProcessor.ENDPOINT_ANNOTATION,
|
||||
TestConfigurationMetadataAnnotationProcessor.READ_OPERATION_ANNOTATION,
|
||||
TestConfigurationMetadataAnnotationProcessor.NAME_ANNOTATION,
|
||||
TestConfigurationMetadataAnnotationProcessor.IMPORT_AS_CONFIGURATION_PROPERTIES_BEAN_ANNOATION,
|
||||
TestConfigurationMetadataAnnotationProcessor.IMPORT_AS_CONFIGURATION_PROPERTIES_BEANS_ANNOATION);
|
||||
TestConfigurationMetadataAnnotationProcessor.NAME_ANNOTATION);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -74,9 +74,9 @@ class PropertyDescriptorResolverTests {
|
||||
Arrays.asList(HierarchicalPropertiesParent.class, HierarchicalPropertiesGrandparent.class),
|
||||
(type, metadataEnv) -> {
|
||||
PropertyDescriptorResolver resolver = new PropertyDescriptorResolver(metadataEnv);
|
||||
assertThat(resolver.resolve(type, false, null).map(PropertyDescriptor::getName))
|
||||
.containsExactly("third", "second", "first");
|
||||
assertThat(resolver.resolve(type, false, null)
|
||||
assertThat(resolver.resolve(type, null).map(PropertyDescriptor::getName)).containsExactly("third",
|
||||
"second", "first");
|
||||
assertThat(resolver.resolve(type, null)
|
||||
.map((descriptor) -> descriptor.resolveItemMetadata("test", metadataEnv))
|
||||
.map(ItemMetadata::getDefaultValue)).containsExactly("three", "two", "one");
|
||||
});
|
||||
@@ -155,7 +155,7 @@ class PropertyDescriptorResolverTests {
|
||||
Consumer<Stream<PropertyDescriptor<?>>> stream) {
|
||||
return (element, metadataEnv) -> {
|
||||
PropertyDescriptorResolver resolver = new PropertyDescriptorResolver(metadataEnv);
|
||||
stream.accept(resolver.resolve(element, false, null));
|
||||
stream.accept(resolver.resolve(element, null));
|
||||
};
|
||||
}
|
||||
|
||||
|
||||
@@ -57,10 +57,6 @@ public class TestConfigurationMetadataAnnotationProcessor extends ConfigurationM
|
||||
|
||||
public static final String NAME_ANNOTATION = "org.springframework.boot.configurationsample.Name";
|
||||
|
||||
public static final String IMPORT_AS_CONFIGURATION_PROPERTIES_BEAN_ANNOATION = "org.springframework.boot.configurationsample.ImportAsConfigurationPropertiesBean";
|
||||
|
||||
public static final String IMPORT_AS_CONFIGURATION_PROPERTIES_BEANS_ANNOATION = "org.springframework.boot.configurationsample.ImportAsConfigurationPropertiesBeans";
|
||||
|
||||
private ConfigurationMetadata metadata;
|
||||
|
||||
private final File outputLocation;
|
||||
@@ -109,16 +105,6 @@ public class TestConfigurationMetadataAnnotationProcessor extends ConfigurationM
|
||||
return NAME_ANNOTATION;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected String importAsConfigurationPropertiesBeanAnnotation() {
|
||||
return IMPORT_AS_CONFIGURATION_PROPERTIES_BEAN_ANNOATION;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected String importAsConfigurationPropertiesBeansAnnotation() {
|
||||
return IMPORT_AS_CONFIGURATION_PROPERTIES_BEANS_ANNOATION;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected ConfigurationMetadata writeMetaData() throws Exception {
|
||||
super.writeMetaData();
|
||||
|
||||
@@ -1,52 +0,0 @@
|
||||
/*
|
||||
* Copyright 2012-2020 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
|
||||
*
|
||||
* https://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;
|
||||
|
||||
import java.lang.annotation.Documented;
|
||||
import java.lang.annotation.ElementType;
|
||||
import java.lang.annotation.Repeatable;
|
||||
import java.lang.annotation.Retention;
|
||||
import java.lang.annotation.RetentionPolicy;
|
||||
import java.lang.annotation.Target;
|
||||
|
||||
import org.springframework.core.annotation.AliasFor;
|
||||
|
||||
/**
|
||||
* Alternative to Spring Boot's {@code ImportAsConfigurationPropertiesBean} for testing
|
||||
* (removes the need for a dependency on the real annotation).
|
||||
*
|
||||
* @author Phillip Webb
|
||||
*/
|
||||
@Target(ElementType.TYPE)
|
||||
@Retention(RetentionPolicy.RUNTIME)
|
||||
@Documented
|
||||
@ConfigurationProperties
|
||||
@Repeatable(ImportAsConfigurationPropertiesBeans.class)
|
||||
public @interface ImportAsConfigurationPropertiesBean {
|
||||
|
||||
Class<?>[] type();
|
||||
|
||||
@AliasFor(annotation = ConfigurationProperties.class)
|
||||
String prefix() default "";
|
||||
|
||||
@AliasFor(annotation = ConfigurationProperties.class)
|
||||
boolean ignoreInvalidFields() default false;
|
||||
|
||||
@AliasFor(annotation = ConfigurationProperties.class)
|
||||
boolean ignoreUnknownFields() default true;
|
||||
|
||||
}
|
||||
@@ -1,38 +0,0 @@
|
||||
/*
|
||||
* Copyright 2012-2020 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
|
||||
*
|
||||
* https://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;
|
||||
|
||||
import java.lang.annotation.Documented;
|
||||
import java.lang.annotation.ElementType;
|
||||
import java.lang.annotation.Retention;
|
||||
import java.lang.annotation.RetentionPolicy;
|
||||
import java.lang.annotation.Target;
|
||||
|
||||
/**
|
||||
* Alternative to Spring Boot's {@code ImportAsConfigurationPropertiesBeans} for testing
|
||||
* (removes the need for a dependency on the real annotation).
|
||||
*
|
||||
* @author Phillip Webb
|
||||
*/
|
||||
@Target(ElementType.TYPE)
|
||||
@Retention(RetentionPolicy.RUNTIME)
|
||||
@Documented
|
||||
public @interface ImportAsConfigurationPropertiesBeans {
|
||||
|
||||
ImportAsConfigurationPropertiesBean[] value();
|
||||
|
||||
}
|
||||
@@ -1,29 +0,0 @@
|
||||
/*
|
||||
* Copyright 2012-2020 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
|
||||
*
|
||||
* https://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.importbean;
|
||||
|
||||
import org.springframework.boot.configurationsample.ImportAsConfigurationPropertiesBean;
|
||||
|
||||
/**
|
||||
* An import of a java bean.
|
||||
*
|
||||
* @author Phillip Webb
|
||||
*/
|
||||
@ImportAsConfigurationPropertiesBean(type = ImportedAnnotatedJavaBean.class)
|
||||
public class ImportAnnotatedJavaBean {
|
||||
|
||||
}
|
||||
@@ -1,29 +0,0 @@
|
||||
/*
|
||||
* Copyright 2012-2020 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
|
||||
*
|
||||
* https://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.importbean;
|
||||
|
||||
import org.springframework.boot.configurationsample.ImportAsConfigurationPropertiesBean;
|
||||
|
||||
/**
|
||||
* An import of a java bean.
|
||||
*
|
||||
* @author Phillip Webb
|
||||
*/
|
||||
@ImportAsConfigurationPropertiesBean(type = ImportedJavaBean.class, prefix = "importbean")
|
||||
public class ImportJavaBeanConfigurationPropertiesBean {
|
||||
|
||||
}
|
||||
@@ -1,30 +0,0 @@
|
||||
/*
|
||||
* Copyright 2012-2020 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
|
||||
*
|
||||
* https://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.importbean;
|
||||
|
||||
import org.springframework.boot.configurationsample.ImportAsConfigurationPropertiesBean;
|
||||
|
||||
/**
|
||||
* An import of a java bean and a value object.
|
||||
*
|
||||
* @author Phillip Webb
|
||||
*/
|
||||
@ImportAsConfigurationPropertiesBean(type = { ImportedJavaBean.class, ImportedValueObject.class },
|
||||
prefix = "importbean")
|
||||
public class ImportMultipleTypeConfigurationPropertiesBean {
|
||||
|
||||
}
|
||||
@@ -1,30 +0,0 @@
|
||||
/*
|
||||
* Copyright 2012-2020 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
|
||||
*
|
||||
* https://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.importbean;
|
||||
|
||||
import org.springframework.boot.configurationsample.ImportAsConfigurationPropertiesBean;
|
||||
|
||||
/**
|
||||
* An import of a java bean and a value object.
|
||||
*
|
||||
* @author Phillip Webb
|
||||
*/
|
||||
@ImportAsConfigurationPropertiesBean(type = ImportedJavaBean.class, prefix = "jb")
|
||||
@ImportAsConfigurationPropertiesBean(type = ImportedValueObject.class, prefix = "vo")
|
||||
public class ImportRepeatedConfigurationPropertiesBean {
|
||||
|
||||
}
|
||||
@@ -1,29 +0,0 @@
|
||||
/*
|
||||
* Copyright 2012-2020 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
|
||||
*
|
||||
* https://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.importbean;
|
||||
|
||||
import org.springframework.boot.configurationsample.ImportAsConfigurationPropertiesBean;
|
||||
|
||||
/**
|
||||
* An import of a value object.
|
||||
*
|
||||
* @author Phillip Webb
|
||||
*/
|
||||
@ImportAsConfigurationPropertiesBean(type = ImportedValueObject.class, prefix = "importbean")
|
||||
public class ImportValueObjectConfigurationPropertiesBean {
|
||||
|
||||
}
|
||||
@@ -1,39 +0,0 @@
|
||||
/*
|
||||
* Copyright 2012-2020 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
|
||||
*
|
||||
* https://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.importbean;
|
||||
|
||||
import org.springframework.boot.configurationsample.ConfigurationProperties;
|
||||
|
||||
/**
|
||||
* Java bean that can be imported.
|
||||
*
|
||||
* @author Phillip Webb
|
||||
*/
|
||||
@ConfigurationProperties(prefix = "test")
|
||||
public class ImportedAnnotatedJavaBean {
|
||||
|
||||
private String name;
|
||||
|
||||
public String getName() {
|
||||
return this.name;
|
||||
}
|
||||
|
||||
public void setName(String name) {
|
||||
this.name = name;
|
||||
}
|
||||
|
||||
}
|
||||
@@ -1,36 +0,0 @@
|
||||
/*
|
||||
* Copyright 2012-2020 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
|
||||
*
|
||||
* https://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.importbean;
|
||||
|
||||
/**
|
||||
* Java bean that can be imported.
|
||||
*
|
||||
* @author Phillip Webb
|
||||
*/
|
||||
public class ImportedJavaBean {
|
||||
|
||||
private String name;
|
||||
|
||||
public String getName() {
|
||||
return this.name;
|
||||
}
|
||||
|
||||
public void setName(String name) {
|
||||
this.name = name;
|
||||
}
|
||||
|
||||
}
|
||||
@@ -1,36 +0,0 @@
|
||||
/*
|
||||
* Copyright 2012-2020 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
|
||||
*
|
||||
* https://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.importbean;
|
||||
|
||||
/**
|
||||
* Value object that can be imported.
|
||||
*
|
||||
* @author Phillip Webb
|
||||
*/
|
||||
public class ImportedValueObject {
|
||||
|
||||
private final String value;
|
||||
|
||||
public ImportedValueObject(String value) {
|
||||
this.value = value;
|
||||
}
|
||||
|
||||
public String getValue() {
|
||||
return this.value;
|
||||
}
|
||||
|
||||
}
|
||||
Reference in New Issue
Block a user