From c91431c9b1eea471d62da10a819be41e279dc7d9 Mon Sep 17 00:00:00 2001 From: Martin Kouba Date: Fri, 3 Sep 2021 13:50:29 +0200 Subject: [PATCH 1/2] ArC - make it possible to identify additional bean archives --- .../BeanArchivePredicateBuildItem.java | 25 +++++++++++ .../arc/deployment/BeanArchiveProcessor.java | 41 +++++++++++++++---- 2 files changed, 58 insertions(+), 8 deletions(-) create mode 100644 extensions/arc/deployment/src/main/java/io/quarkus/arc/deployment/BeanArchivePredicateBuildItem.java diff --git a/extensions/arc/deployment/src/main/java/io/quarkus/arc/deployment/BeanArchivePredicateBuildItem.java b/extensions/arc/deployment/src/main/java/io/quarkus/arc/deployment/BeanArchivePredicateBuildItem.java new file mode 100644 index 0000000000000..26aabbf179746 --- /dev/null +++ b/extensions/arc/deployment/src/main/java/io/quarkus/arc/deployment/BeanArchivePredicateBuildItem.java @@ -0,0 +1,25 @@ +package io.quarkus.arc.deployment; + +import java.util.function.Predicate; + +import io.quarkus.builder.item.MultiBuildItem; +import io.quarkus.deployment.ApplicationArchive; + +/** + * + * By default, only explict/implicit bean archives (as defined by the spec) are considered during the bean discovery. However, + * extensions can register a logic to identify additional bean archives. + */ +public final class BeanArchivePredicateBuildItem extends MultiBuildItem { + + private final Predicate predicate; + + public BeanArchivePredicateBuildItem(Predicate predicate) { + this.predicate = predicate; + } + + public Predicate getPredicate() { + return predicate; + } + +} diff --git a/extensions/arc/deployment/src/main/java/io/quarkus/arc/deployment/BeanArchiveProcessor.java b/extensions/arc/deployment/src/main/java/io/quarkus/arc/deployment/BeanArchiveProcessor.java index 2bb662fd5a7b0..8133de96db552 100644 --- a/extensions/arc/deployment/src/main/java/io/quarkus/arc/deployment/BeanArchiveProcessor.java +++ b/extensions/arc/deployment/src/main/java/io/quarkus/arc/deployment/BeanArchiveProcessor.java @@ -1,6 +1,11 @@ package io.quarkus.arc.deployment; -import java.util.*; +import java.util.ArrayList; +import java.util.Collection; +import java.util.HashSet; +import java.util.List; +import java.util.Optional; +import java.util.Set; import java.util.stream.Collectors; import org.jboss.jandex.AnnotationInstance; @@ -35,12 +40,13 @@ public BeanArchiveIndexBuildItem build(ArcConfig config, ApplicationArchivesBuil List additionalBeanDefiningAnnotations, List additionalBeans, List generatedBeans, LiveReloadBuildItem liveReloadBuildItem, BuildProducer generatedClass, - CustomScopeAnnotationsBuildItem customScopes, List excludeDependencyBuildItems) + CustomScopeAnnotationsBuildItem customScopes, List excludeDependencyBuildItems, + List beanArchivePredicates) throws Exception { // First build an index from application archives IndexView applicationIndex = buildApplicationIndex(config, applicationArchivesBuildItem, - additionalBeanDefiningAnnotations, customScopes, excludeDependencyBuildItems); + additionalBeanDefiningAnnotations, customScopes, excludeDependencyBuildItems, beanArchivePredicates); // Then build additional index for beans added by extensions Indexer additionalBeanIndexer = new Indexer(); @@ -81,7 +87,8 @@ public BeanArchiveIndexBuildItem build(ArcConfig config, ApplicationArchivesBuil private IndexView buildApplicationIndex(ArcConfig config, ApplicationArchivesBuildItem applicationArchivesBuildItem, List additionalBeanDefiningAnnotations, - CustomScopeAnnotationsBuildItem customScopes, List excludeDependencyBuildItems) { + CustomScopeAnnotationsBuildItem customScopes, List excludeDependencyBuildItems, + List beanArchivePredicates) { Set archives = applicationArchivesBuildItem.getAllApplicationArchives(); @@ -116,10 +123,8 @@ private IndexView buildApplicationIndex(ArcConfig config, ApplicationArchivesBui continue; } IndexView index = archive.getIndex(); - // NOTE: Implicit bean archive without beans.xml contains one or more bean classes with a bean defining annotation and no extension - if (archive.getChildPath("META-INF/beans.xml") != null || archive.getChildPath("WEB-INF/beans.xml") != null - || (index.getAllKnownImplementors(DotNames.EXTENSION).isEmpty() - && containsBeanDefiningAnnotation(index, beanDefiningAnnotations))) { + if (isExplicitBeanArchive(archive) || isImplicitBeanArchive(index, beanDefiningAnnotations) + || isAdditionalBeanArchive(archive, beanArchivePredicates)) { indexes.add(index); } } @@ -127,6 +132,26 @@ && containsBeanDefiningAnnotation(index, beanDefiningAnnotations))) { return CompositeIndex.create(indexes); } + private boolean isExplicitBeanArchive(ApplicationArchive archive) { + return archive.getChildPath("META-INF/beans.xml") != null || archive.getChildPath("WEB-INF/beans.xml") != null; + } + + private boolean isImplicitBeanArchive(IndexView index, Set beanDefiningAnnotations) { + // NOTE: Implicit bean archive without beans.xml contains one or more bean classes with a bean defining annotation and no extension + return index.getAllKnownImplementors(DotNames.EXTENSION).isEmpty() + && containsBeanDefiningAnnotation(index, beanDefiningAnnotations); + } + + private boolean isAdditionalBeanArchive(ApplicationArchive archive, + List beanArchivePredicates) { + for (BeanArchivePredicateBuildItem p : beanArchivePredicates) { + if (p.getPredicate().test(archive)) { + return true; + } + } + return false; + } + private boolean isApplicationArchiveExcluded(ArcConfig config, List excludeDependencyBuildItems, ApplicationArchive archive) { if (archive.getArtifactKey() != null) { From 13bc4d27509dad67c6ef4fcfb4148ab23d802214 Mon Sep 17 00:00:00 2001 From: Martin Kouba Date: Fri, 3 Sep 2021 13:52:14 +0200 Subject: [PATCH 2/2] gRPC - register additional bean archives - an application archive that contains a MutinyBean implementor is an additional bean archive - resolves #19864 --- .../grpc/deployment/GrpcServerProcessor.java | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/extensions/grpc/deployment/src/main/java/io/quarkus/grpc/deployment/GrpcServerProcessor.java b/extensions/grpc/deployment/src/main/java/io/quarkus/grpc/deployment/GrpcServerProcessor.java index dab50d36a386c..ec726faa57c9f 100644 --- a/extensions/grpc/deployment/src/main/java/io/quarkus/grpc/deployment/GrpcServerProcessor.java +++ b/extensions/grpc/deployment/src/main/java/io/quarkus/grpc/deployment/GrpcServerProcessor.java @@ -40,6 +40,7 @@ import io.grpc.internal.ServerImpl; import io.quarkus.arc.deployment.AdditionalBeanBuildItem; import io.quarkus.arc.deployment.AnnotationsTransformerBuildItem; +import io.quarkus.arc.deployment.BeanArchivePredicateBuildItem; import io.quarkus.arc.deployment.CustomScopeAnnotationsBuildItem; import io.quarkus.arc.deployment.GeneratedBeanBuildItem; import io.quarkus.arc.deployment.GeneratedBeanGizmoAdaptor; @@ -49,6 +50,7 @@ import io.quarkus.arc.processor.AnnotationsTransformer; import io.quarkus.arc.processor.BeanInfo; import io.quarkus.arc.processor.BuiltinScope; +import io.quarkus.deployment.ApplicationArchive; import io.quarkus.deployment.IsDevelopment; import io.quarkus.deployment.IsNormal; import io.quarkus.deployment.annotations.BuildProducer; @@ -546,6 +548,18 @@ void configureMetrics(GrpcBuildTimeConfig configuration, Optional() { + + @Override + public boolean test(ApplicationArchive archive) { + // Every archive that contains a generated implementor of MutinyBean is considered a bean archive + return !archive.getIndex().getKnownDirectImplementors(GrpcDotNames.MUTINY_BEAN).isEmpty(); + } + }); + } + private static class GrpcInterceptors { final Set globalInterceptors; final Set nonGlobalInterceptors;