Add MergedAnnotation.getRoot() method
Update `MergedAnnotation` with a `getRoot()` method that allows the root direct annotation to be retrieved easily. Closes gh-22818
This commit is contained in:
parent
7cc132b2a9
commit
83cb51aec6
|
@ -140,6 +140,13 @@ public interface MergedAnnotation<A extends Annotation> {
|
||||||
@Nullable
|
@Nullable
|
||||||
MergedAnnotation<?> getParent();
|
MergedAnnotation<?> getParent();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the root annotation, i.e. the {@link #getDepth() depth} {@code 0}
|
||||||
|
* annotation as directly declared on the source.
|
||||||
|
* @return the root annotation
|
||||||
|
*/
|
||||||
|
MergedAnnotation<?> getRoot();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Determine if the specified attribute name has a non-default value when
|
* Determine if the specified attribute name has a non-default value when
|
||||||
* compared to the annotation declaration.
|
* compared to the annotation declaration.
|
||||||
|
|
|
@ -66,6 +66,11 @@ final class MissingMergedAnnotation<A extends Annotation> extends AbstractMerged
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public MergedAnnotation<?> getRoot() {
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public int getDepth() {
|
public int getDepth() {
|
||||||
return -1;
|
return -1;
|
||||||
|
|
|
@ -171,6 +171,16 @@ final class TypeMappedAnnotation<A extends Annotation> extends AbstractMergedAnn
|
||||||
this.valueExtractor, this.aggregateIndex, this.resolvedRootMirrors);
|
this.valueExtractor, this.aggregateIndex, this.resolvedRootMirrors);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public MergedAnnotation<?> getRoot() {
|
||||||
|
if (getDepth() == 0) {
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
AnnotationTypeMapping rootMapping = this.mapping.getRoot();
|
||||||
|
return new TypeMappedAnnotation<>(rootMapping, this.source, this.rootAttributes,
|
||||||
|
this.valueExtractor, this.aggregateIndex, this.resolvedRootMirrors);
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean hasDefaultValue(String attributeName) {
|
public boolean hasDefaultValue(String attributeName) {
|
||||||
int attributeIndex = getAttributeIndex(attributeName, true);
|
int attributeIndex = getAttributeIndex(attributeName, true);
|
||||||
|
|
|
@ -154,6 +154,22 @@ public class MergedAnnotationsTests {
|
||||||
.isEqualTo(ComposedTransactionalComponent.class);
|
.isEqualTo(ComposedTransactionalComponent.class);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void getRootWhenNotDirect() {
|
||||||
|
MergedAnnotations annotations = MergedAnnotations.from(ComposedTransactionalComponentClass.class);
|
||||||
|
MergedAnnotation<?> annotation = annotations.get(TransactionalComponent.class);
|
||||||
|
assertThat(annotation.getDepth()).isGreaterThan(0);
|
||||||
|
assertThat(annotation.getRoot().getType()).isEqualTo(ComposedTransactionalComponent.class);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void getRootWhenDirect() {
|
||||||
|
MergedAnnotations annotations = MergedAnnotations.from(ComposedTransactionalComponentClass.class);
|
||||||
|
MergedAnnotation<?> annotation = annotations.get(ComposedTransactionalComponent.class);
|
||||||
|
assertThat(annotation.getDepth()).isEqualTo(0);
|
||||||
|
assertThat(annotation.getRoot()).isSameAs(annotation);
|
||||||
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void collectMultiValueMapFromNonAnnotatedClass() {
|
public void collectMultiValueMapFromNonAnnotatedClass() {
|
||||||
MultiValueMap<String, Object> map = MergedAnnotations.from(
|
MultiValueMap<String, Object> map = MergedAnnotations.from(
|
||||||
|
|
|
@ -78,6 +78,11 @@ public class MissingMergedAnnotationTests {
|
||||||
assertThat(this.missing.getParent()).isNull();
|
assertThat(this.missing.getParent()).isNull();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void getRootReturnsEmptyAnnotation() {
|
||||||
|
assertThat(this.missing.getRoot()).isSameAs(this.missing);
|
||||||
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void hasNonDefaultValueThrowsNoSuchElementException() {
|
public void hasNonDefaultValueThrowsNoSuchElementException() {
|
||||||
assertThatNoSuchElementException().isThrownBy(
|
assertThatNoSuchElementException().isThrownBy(
|
||||||
|
|
Loading…
Reference in New Issue