Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add targetPackage property to the @Introspected annotation #9105

Merged
merged 3 commits into from
Apr 17, 2023
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Next Next commit
Apply review comments
  • Loading branch information
andriy-dmytruk committed Apr 14, 2023
commit bb5b6a7c1274e2f8a43f3f2f77088a89c168b0d2
Original file line number Diff line number Diff line change
Expand Up @@ -161,7 +161,7 @@
* @since 3.9.0
*/
@Experimental
String introspectionPackage() default "";
String targetPackage() default "";

/**
* Allow pre-computed indexes for property lookups based on an annotation and a member.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -89,7 +89,7 @@ package test;

import io.micronaut.core.annotation.Introspected;

@Introspected(introspectionPackage = "test.introspections")
@Introspected(targetPackage = "test.introspections")
public class Test {
private String name;
public Test(String name) {
Expand Down Expand Up @@ -947,7 +947,7 @@ package test;
import io.micronaut.core.annotation.Introspected;
import io.micronaut.inject.visitor.beans.OuterBean;

@Introspected(classes=OuterBean.InnerBean.class, introspectionPackage="test.micronaut.intro")
@Introspected(classes=OuterBean.InnerBean.class, targetPackage="test.micronaut.intro")
class Test {}
''')

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -125,15 +125,16 @@ final class BeanIntrospectionWriter extends AbstractAnnotationMetadataWriter {
/**
* Default constructor.
*
* @param targetPackage The package to write introspection to
* @param classElement The class element
* @param beanAnnotationMetadata The bean annotation metadata
*/
BeanIntrospectionWriter(String introspectionPackage, ClassElement classElement, AnnotationMetadata beanAnnotationMetadata) {
super(computeReferenceName(introspectionPackage, classElement.getName()), classElement, beanAnnotationMetadata, true);
BeanIntrospectionWriter(String targetPackage, ClassElement classElement, AnnotationMetadata beanAnnotationMetadata) {
super(computeReferenceName(targetPackage, classElement.getName()), classElement, beanAnnotationMetadata, true);
final String name = classElement.getName();
this.classElement = classElement;
this.referenceWriter = new ClassWriter(ClassWriter.COMPUTE_MAXS);
this.introspectionName = computeShortIntrospectionName(introspectionPackage, name);
this.introspectionName = computeShortIntrospectionName(targetPackage, name);
this.introspectionType = getTypeReferenceForName(introspectionName);
this.beanType = getTypeReferenceForName(name);
this.dispatchWriter = new DispatchWriter(introspectionType, Type.getType(AbstractInitializableBeanIntrospection.class));
Expand All @@ -142,24 +143,25 @@ final class BeanIntrospectionWriter extends AbstractAnnotationMetadataWriter {
/**
* Constructor used to generate a reference for already compiled classes.
*
* @param targetPackage The package to write introspection to
* @param generatingType The originating type
* @param index A unique index
* @param originatingElement The originating element
* @param classElement The class element
* @param beanAnnotationMetadata The bean annotation metadata
*/
BeanIntrospectionWriter(
String introspectionPackage,
String targetPackage,
String generatingType,
int index,
ClassElement originatingElement,
ClassElement classElement,
AnnotationMetadata beanAnnotationMetadata) {
super(computeReferenceName(introspectionPackage, generatingType) + index, originatingElement, beanAnnotationMetadata, true);
super(computeReferenceName(targetPackage, generatingType) + index, originatingElement, beanAnnotationMetadata, true);
final String className = classElement.getName();
this.classElement = classElement;
this.referenceWriter = new ClassWriter(ClassWriter.COMPUTE_MAXS);
this.introspectionName = computeIntrospectionName(introspectionPackage, className);
this.introspectionName = computeIntrospectionName(targetPackage, className);
this.introspectionType = getTypeReferenceForName(introspectionName);
this.beanType = getTypeReferenceForName(className);
this.dispatchWriter = new DispatchWriter(introspectionType);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -67,6 +67,8 @@ public class IntrospectedTypeElementVisitor implements TypeElementVisitor<Object
private static final Introspected.AccessKind[] DEFAULT_ACCESS_KIND = { Introspected.AccessKind.METHOD };
private static final Introspected.Visibility[] DEFAULT_VISIBILITY = { Introspected.Visibility.DEFAULT };

private static final Introspected.Visibility[] PUBLIC_VISIBILITY = { Introspected.Visibility.PUBLIC };

private Map<String, BeanIntrospectionWriter> writers = new LinkedHashMap<>(10);
private List<AbstractIntrospection> abstractIntrospections = new ArrayList<>();
private AbstractIntrospection currentAbstractIntrospection;
Expand Down Expand Up @@ -165,6 +167,17 @@ private void introspectIfValidated(VisitorContext context, ClassElement declarin
}
}

private static Introspected.Visibility[] getVisibilities(Introspected.Visibility[] current, String targetPackage, ClassElement classElement) {
if (ArrayUtils.isEmpty(current)) {
if (classElement.getPackageName().equals(targetPackage)) {
return DEFAULT_VISIBILITY;
} else {
return PUBLIC_VISIBILITY;
}
}
return current;
}

private void processIntrospected(ClassElement element, VisitorContext context, AnnotationValue<Introspected> introspected) {
final String[] packages = introspected.stringValues("packages");
final AnnotationClassValue[] classes = introspected.get("classes", AnnotationClassValue[].class, new AnnotationClassValue[0]);
Expand All @@ -180,16 +193,16 @@ private void processIntrospected(ClassElement element, VisitorContext context, A
Introspected.AccessKind[] accessKinds = introspected.enumValues("accessKind", Introspected.AccessKind.class);
Introspected.Visibility[] visibilities =
introspected.enumValues("visibility", Introspected.Visibility.class);
final String introspectionPackage = introspected.stringValue("introspectionPackage").orElse(element.getPackageName());
final String targetPackage = introspected.stringValue("targetPackage").orElse(element.getPackageName());

if (ArrayUtils.isEmpty(accessKinds)) {
accessKinds = DEFAULT_ACCESS_KIND;
}
if (ArrayUtils.isEmpty(visibilities)) {
visibilities = DEFAULT_VISIBILITY;
}
// if (ArrayUtils.isEmpty(visibilities)) {
// visibilities = DEFAULT_VISIBILITY;
// }
Introspected.AccessKind[] finalAccessKinds = accessKinds;
Introspected.Visibility[] finalVisibilities = visibilities;
// Introspected.Visibility[] finalVisibilities = visibilities;

if (CollectionUtils.isEmpty(toIndex)) {
indexedAnnotations = CollectionUtils.setOf(
Expand All @@ -211,15 +224,14 @@ private void processIntrospected(ClassElement element, VisitorContext context, A
for (AnnotationClassValue aClass : classes) {
final Optional<ClassElement> classElement = context.getClassElement(aClass.getName());


classElement.ifPresent(ce -> {
if (ce.isPublic() && !isIntrospected(context, ce)) {
final AnnotationMetadata typeMetadata = ce.getAnnotationMetadata();
final AnnotationMetadata resolvedMetadata = typeMetadata == AnnotationMetadata.EMPTY_METADATA
? element.getAnnotationMetadata()
: new AnnotationMetadataHierarchy(element.getAnnotationMetadata(), typeMetadata);
final BeanIntrospectionWriter writer = new BeanIntrospectionWriter(
introspectionPackage,
targetPackage,
element.getName(),
index.getAndIncrement(),
element,
Expand All @@ -235,7 +247,7 @@ private void processIntrospected(ClassElement element, VisitorContext context, A
indexedAnnotations,
ce,
writer,
finalVisibilities,
getVisibilities(visibilities, targetPackage, ce),
finalAccessKinds
);
}
Expand All @@ -254,7 +266,7 @@ private void processIntrospected(ClassElement element, VisitorContext context, A
continue;
}
final BeanIntrospectionWriter writer = new BeanIntrospectionWriter(
introspectionPackage,
targetPackage,
element.getName(),
j++,
element,
Expand All @@ -270,7 +282,7 @@ private void processIntrospected(ClassElement element, VisitorContext context, A
indexedAnnotations,
classElement,
writer,
finalVisibilities,
getVisibilities(visibilities, targetPackage, classElement),
finalAccessKinds
);
}
Expand All @@ -279,7 +291,7 @@ private void processIntrospected(ClassElement element, VisitorContext context, A
} else {

final BeanIntrospectionWriter writer = new BeanIntrospectionWriter(
introspectionPackage,
targetPackage,
element,
metadata ? element.getAnnotationMetadata() : null
);
Expand All @@ -292,7 +304,7 @@ private void processIntrospected(ClassElement element, VisitorContext context, A
indexedAnnotations,
element,
writer,
finalVisibilities,
getVisibilities(visibilities, targetPackage, element),
finalAccessKinds
);
}
Expand Down