From 01396ac2e0288c5ba60c2dfa79717f1a33a20fdb Mon Sep 17 00:00:00 2001 From: Martin Kouba Date: Wed, 8 Feb 2023 16:24:03 +0100 Subject: [PATCH] ArC: detect unsupported Inject annotations - including javax.inject.Inject, com.google.inject.Inject, com.oracle.svm.core.annotate.Inject and org.gradle.internal.impldep.javax.inject.Inject --- .../WrongAnnotationUsageProcessor.java | 34 ++++++------- .../observer/ObserverTransformerTest.java | 3 +- .../BeanWithIncorrectInject.java | 21 ++++++++ .../wrongannotations/WrongInjectTest.java | 50 +++++++++++++++++++ 4 files changed, 89 insertions(+), 19 deletions(-) create mode 100644 extensions/arc/deployment/src/test/java/io/quarkus/arc/test/wrongannotations/BeanWithIncorrectInject.java create mode 100644 extensions/arc/deployment/src/test/java/io/quarkus/arc/test/wrongannotations/WrongInjectTest.java diff --git a/extensions/arc/deployment/src/main/java/io/quarkus/arc/deployment/WrongAnnotationUsageProcessor.java b/extensions/arc/deployment/src/main/java/io/quarkus/arc/deployment/WrongAnnotationUsageProcessor.java index 2d7434b23e08b..a68213e6271b1 100644 --- a/extensions/arc/deployment/src/main/java/io/quarkus/arc/deployment/WrongAnnotationUsageProcessor.java +++ b/extensions/arc/deployment/src/main/java/io/quarkus/arc/deployment/WrongAnnotationUsageProcessor.java @@ -7,7 +7,6 @@ import java.util.List; import java.util.Map; import java.util.Map.Entry; -import java.util.function.Function; import org.jboss.jandex.AnnotationInstance; import org.jboss.jandex.AnnotationTarget; @@ -38,24 +37,25 @@ void detect(ArcConfig config, ApplicationIndexBuildItem applicationIndex, Custom // Detect unsupported annotations List unsupported = new ArrayList<>(); - Function singletonFun = new Function() { - @Override - public String apply(AnnotationInstance annotationInstance) { - return String.format("%s declared on %s, use @jakarta.inject.Singleton instead", - annotationInstance.toString(false), getTargetInfo(annotationInstance)); - } - }; - unsupported.add(new UnsupportedAnnotation(DotName.createSimple("com.google.inject.Singleton"), singletonFun)); - unsupported.add(new UnsupportedAnnotation(DotName.createSimple("jakarta.ejb.Singleton"), singletonFun)); - unsupported.add(new UnsupportedAnnotation(DotName.createSimple("groovy.lang.Singleton"), singletonFun)); - unsupported.add(new UnsupportedAnnotation(DotName.createSimple("jakarta.ejb.Singleton"), singletonFun)); + String correctSingleton = "@jakarta.inject.Singleton"; + unsupported.add(new UnsupportedAnnotation("com.google.inject.Singleton", correctSingleton)); + unsupported.add(new UnsupportedAnnotation("jakarta.ejb.Singleton", correctSingleton)); + unsupported.add(new UnsupportedAnnotation("groovy.lang.Singleton", correctSingleton)); + + String correctInject = "@jakarta.inject.Inject"; + unsupported.add(new UnsupportedAnnotation("javax.inject.Inject", correctInject)); + unsupported.add(new UnsupportedAnnotation("com.google.inject.Inject", correctInject)); + unsupported.add(new UnsupportedAnnotation("com.oracle.svm.core.annotate.Inject", correctInject)); + unsupported.add(new UnsupportedAnnotation("org.gradle.internal.impldep.javax.inject.Inject", + correctInject)); Map wrongUsages = new HashMap<>(); for (UnsupportedAnnotation annotation : unsupported) { for (AnnotationInstance annotationInstance : index.getAnnotations(annotation.name)) { - wrongUsages.put(annotationInstance, annotation.messageFun.apply(annotationInstance)); + wrongUsages.put(annotationInstance, String.format("%s declared on %s, use %s instead", + annotationInstance.toString(false), getTargetInfo(annotationInstance), annotation.correctAnnotation)); } } @@ -108,11 +108,11 @@ public String apply(AnnotationInstance annotationInstance) { private static class UnsupportedAnnotation { final DotName name; - final Function messageFun; + final String correctAnnotation; - UnsupportedAnnotation(DotName name, Function messageFun) { - this.name = name; - this.messageFun = messageFun; + UnsupportedAnnotation(String name, String correctAnnotation) { + this.name = DotName.createSimple(name); + this.correctAnnotation = correctAnnotation; } } diff --git a/extensions/arc/deployment/src/test/java/io/quarkus/arc/test/observer/ObserverTransformerTest.java b/extensions/arc/deployment/src/test/java/io/quarkus/arc/test/observer/ObserverTransformerTest.java index 85d09bc5bc91d..f11cf16f08176 100644 --- a/extensions/arc/deployment/src/test/java/io/quarkus/arc/test/observer/ObserverTransformerTest.java +++ b/extensions/arc/deployment/src/test/java/io/quarkus/arc/test/observer/ObserverTransformerTest.java @@ -17,6 +17,7 @@ import jakarta.enterprise.event.Event; import jakarta.enterprise.event.Observes; +import jakarta.inject.Inject; import jakarta.inject.Qualifier; import jakarta.inject.Singleton; @@ -26,8 +27,6 @@ import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.RegisterExtension; -import com.google.inject.Inject; - import io.quarkus.arc.deployment.ObserverTransformerBuildItem; import io.quarkus.arc.processor.ObserverTransformer; import io.quarkus.builder.BuildChainBuilder; diff --git a/extensions/arc/deployment/src/test/java/io/quarkus/arc/test/wrongannotations/BeanWithIncorrectInject.java b/extensions/arc/deployment/src/test/java/io/quarkus/arc/test/wrongannotations/BeanWithIncorrectInject.java new file mode 100644 index 0000000000000..20d8575c2fc88 --- /dev/null +++ b/extensions/arc/deployment/src/test/java/io/quarkus/arc/test/wrongannotations/BeanWithIncorrectInject.java @@ -0,0 +1,21 @@ +package io.quarkus.arc.test.wrongannotations; + +import jakarta.enterprise.inject.spi.BeanManager; + +import com.google.inject.Inject; + +public class BeanWithIncorrectInject { + + @Inject + BeanManager bm1; + + @javax.inject.Inject + BeanManager bm2; + + @com.oracle.svm.core.annotate.Inject + BeanManager bm3; + + @org.gradle.internal.impldep.javax.inject.Inject + BeanManager bm4; + +} diff --git a/extensions/arc/deployment/src/test/java/io/quarkus/arc/test/wrongannotations/WrongInjectTest.java b/extensions/arc/deployment/src/test/java/io/quarkus/arc/test/wrongannotations/WrongInjectTest.java new file mode 100644 index 0000000000000..867a59c529408 --- /dev/null +++ b/extensions/arc/deployment/src/test/java/io/quarkus/arc/test/wrongannotations/WrongInjectTest.java @@ -0,0 +1,50 @@ +package io.quarkus.arc.test.wrongannotations; + +import static org.junit.jupiter.api.Assertions.assertTrue; +import static org.junit.jupiter.api.Assertions.fail; + +import javax.inject.Inject; + +import jakarta.enterprise.inject.spi.BeanManager; + +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.RegisterExtension; + +import io.quarkus.runtime.util.ExceptionUtil; +import io.quarkus.test.QuarkusUnitTest; + +public class WrongInjectTest { + + @RegisterExtension + static final QuarkusUnitTest config = new QuarkusUnitTest() + .withApplicationRoot((jar) -> jar + .addClasses(BeanWithIncorrectInject.class)) + .assertException(t -> { + Throwable rootCause = ExceptionUtil.getRootCause(t); + assertTrue(rootCause.getMessage().contains( + "@com.google.inject.Inject declared on io.quarkus.arc.test.wrongannotations.BeanWithIncorrectInject.bm1, use @jakarta.inject.Inject instead"), + t.toString()); + assertTrue(rootCause.getMessage().contains( + "@javax.inject.Inject declared on io.quarkus.arc.test.wrongannotations.BeanWithIncorrectInject.bm2, use @jakarta.inject.Inject instead"), + t.toString()); + assertTrue(rootCause.getMessage().contains( + "@com.oracle.svm.core.annotate.Inject declared on io.quarkus.arc.test.wrongannotations.BeanWithIncorrectInject.bm3, use @jakarta.inject.Inject instead"), + t.toString()); + assertTrue(rootCause.getMessage().contains( + "@org.gradle.internal.impldep.javax.inject.Inject declared on io.quarkus.arc.test.wrongannotations.BeanWithIncorrectInject.bm4, use @jakarta.inject.Inject instead"), + t.toString()); + assertTrue(rootCause.getMessage().contains( + "@javax.inject.Inject declared on io.quarkus.arc.test.wrongannotations.WrongInjectTest.beanManager, use @jakarta.inject.Inject instead"), + t.toString()); + }); + + @Inject + BeanManager beanManager; + + @Test + public void testValidationFailed() { + // This method should not be invoked + fail(); + } + +}