[weaver-pojo*] Refactor POJO weaver extensibility
This commit is contained in:
@@ -4,12 +4,14 @@ import de.siphalor.tweed5.annotationinheritance.impl.AnnotationInheritanceResolv
|
||||
import de.siphalor.tweed5.typeutils.api.annotations.AnnotationRepeatType;
|
||||
import de.siphalor.tweed5.utils.api.collection.ClassToInstanceMap;
|
||||
import lombok.RequiredArgsConstructor;
|
||||
import lombok.var;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
import org.jspecify.annotations.NonNull;
|
||||
|
||||
import java.lang.annotation.Annotation;
|
||||
import java.lang.reflect.AnnotatedElement;
|
||||
import java.lang.reflect.Array;
|
||||
|
||||
@RequiredArgsConstructor
|
||||
public class AnnotationInheritanceAwareAnnotatedElement implements AnnotatedElement {
|
||||
@@ -48,6 +50,28 @@ public class AnnotationInheritanceAwareAnnotatedElement implements AnnotatedElem
|
||||
return getOrResolveAnnotations().get(annotationClass);
|
||||
}
|
||||
|
||||
@Override
|
||||
public @NonNull <T extends Annotation> @NotNull T[] getAnnotationsByType(@NonNull Class<T> annotationClass) {
|
||||
T annotation = getOrResolveAnnotations().get(annotationClass);
|
||||
if (annotation != null) {
|
||||
//noinspection unchecked
|
||||
T[] array = (T[]) Array.newInstance(annotationClass, 1);
|
||||
array[0] = annotation;
|
||||
return array;
|
||||
}
|
||||
|
||||
AnnotationRepeatType repeatType = AnnotationRepeatType.getType(annotationClass);
|
||||
if (repeatType instanceof AnnotationRepeatType.Repeatable) {
|
||||
var containerRepeatType = ((AnnotationRepeatType.Repeatable) repeatType).containerRepeatType();
|
||||
Annotation containerAnnotation = getOrResolveAnnotations().get(containerRepeatType.annotationClass());
|
||||
if (containerAnnotation != null) {
|
||||
return containerRepeatType.elements(containerAnnotation);
|
||||
}
|
||||
}
|
||||
//noinspection unchecked
|
||||
return (T[]) Array.newInstance(annotationClass, 0);
|
||||
}
|
||||
|
||||
@Override
|
||||
public @NotNull Annotation[] getAnnotations() {
|
||||
return getOrResolveAnnotations().values().toArray(new Annotation[0]);
|
||||
|
||||
@@ -27,7 +27,7 @@ public class AnnotationInheritanceResolver {
|
||||
public ClassToInstanceMap<Annotation> resolve() {
|
||||
resolve(main, Collections.emptySet());
|
||||
|
||||
ClassToInstanceMap<Annotation> resolvedAnnotations = new ClassToInstanceMap<>();
|
||||
ClassToInstanceMap<Annotation> resolvedAnnotations = ClassToInstanceMap.backedBy(new LinkedHashMap<>());
|
||||
|
||||
List<Aggregator> aggregatorList = new ArrayList<>(aggregators.values());
|
||||
for (int i = aggregatorList.size() - 1; i >= 0; i--) {
|
||||
|
||||
@@ -18,6 +18,15 @@ class AnnotationInheritanceAwareAnnotatedElementTest {
|
||||
.isEqualTo(1);
|
||||
}
|
||||
|
||||
@Test
|
||||
void getAnnotationsByTypeAForTarget1() {
|
||||
var element = new AnnotationInheritanceAwareAnnotatedElement(Target1.class);
|
||||
assertThat(element.getAnnotationsByType(A.class))
|
||||
.singleElement()
|
||||
.extracting(A::value)
|
||||
.isEqualTo(1);
|
||||
}
|
||||
|
||||
@Test
|
||||
void getAnnotationBForTarget1() {
|
||||
var element = new AnnotationInheritanceAwareAnnotatedElement(Target1.class);
|
||||
@@ -27,6 +36,15 @@ class AnnotationInheritanceAwareAnnotatedElementTest {
|
||||
.isEqualTo(2);
|
||||
}
|
||||
|
||||
@Test
|
||||
void getAnnotationsByTypeBForTarget1() {
|
||||
var element = new AnnotationInheritanceAwareAnnotatedElement(Target1.class);
|
||||
assertThat(element.getAnnotationsByType(B.class))
|
||||
.singleElement()
|
||||
.extracting(B::value)
|
||||
.isEqualTo(2);
|
||||
}
|
||||
|
||||
@Test
|
||||
void getAnnotationCForTarget1() {
|
||||
var element = new AnnotationInheritanceAwareAnnotatedElement(Target1.class);
|
||||
@@ -36,12 +54,33 @@ class AnnotationInheritanceAwareAnnotatedElementTest {
|
||||
.isEqualTo(10);
|
||||
}
|
||||
|
||||
@Test
|
||||
void getAnnotationsByTypeCForTarget1() {
|
||||
var element = new AnnotationInheritanceAwareAnnotatedElement(Target1.class);
|
||||
assertThat(element.getAnnotationsByType(C.class))
|
||||
.singleElement()
|
||||
.extracting(C::value)
|
||||
.isEqualTo(10);
|
||||
}
|
||||
|
||||
@Test
|
||||
void getAnnotationRForTarget1() {
|
||||
var element = new AnnotationInheritanceAwareAnnotatedElement(Target1.class);
|
||||
assertThat(element.getAnnotation(R.class)).isNull();
|
||||
}
|
||||
|
||||
@Test
|
||||
void getAnnotationsByTypeRForTarget1() {
|
||||
var element = new AnnotationInheritanceAwareAnnotatedElement(Target1.class);
|
||||
assertThat(element.getAnnotationsByType(R.class))
|
||||
.satisfiesExactly(
|
||||
r -> assertThat(r.value()).isEqualTo(4),
|
||||
r -> assertThat(r.value()).isEqualTo(2),
|
||||
r -> assertThat(r.value()).isEqualTo(3),
|
||||
r -> assertThat(r.value()).isEqualTo(10)
|
||||
);
|
||||
}
|
||||
|
||||
@Test
|
||||
void getAnnotationRsForTarget1() {
|
||||
var element = new AnnotationInheritanceAwareAnnotatedElement(Target1.class);
|
||||
@@ -58,6 +97,21 @@ class AnnotationInheritanceAwareAnnotatedElementTest {
|
||||
);
|
||||
}
|
||||
|
||||
@Test
|
||||
void getAnnotationsByTypeRsForTarget1() {
|
||||
var element = new AnnotationInheritanceAwareAnnotatedElement(Target1.class);
|
||||
assertThat(element.getAnnotationsByType(Rs.class))
|
||||
.singleElement()
|
||||
.extracting(Rs::value)
|
||||
.asInstanceOf(array(R[].class))
|
||||
.satisfiesExactly(
|
||||
r -> assertThat(r.value()).isEqualTo(4),
|
||||
r -> assertThat(r.value()).isEqualTo(2),
|
||||
r -> assertThat(r.value()).isEqualTo(3),
|
||||
r -> assertThat(r.value()).isEqualTo(10)
|
||||
);
|
||||
}
|
||||
|
||||
@Test
|
||||
void getAnnotationsForTarget1() {
|
||||
var element = new AnnotationInheritanceAwareAnnotatedElement(Target1.class);
|
||||
|
||||
Reference in New Issue
Block a user