From 6e90db6acd11a6371d7e508e92d5a920bbbda2ed Mon Sep 17 00:00:00 2001 From: Martin Kouba Date: Tue, 13 Jul 2021 09:20:24 +0200 Subject: [PATCH] ArC decorators - fix NPE when non-default delegate qualifiers are used - resolves #18498 --- .../arc/processor/DecoratorGenerator.java | 2 +- .../qualifiers/DelegateQualifiersTest.java | 72 +++++++++++++++++++ 2 files changed, 73 insertions(+), 1 deletion(-) create mode 100644 independent-projects/arc/tests/src/test/java/io/quarkus/arc/test/decorators/qualifiers/DelegateQualifiersTest.java diff --git a/independent-projects/arc/processor/src/main/java/io/quarkus/arc/processor/DecoratorGenerator.java b/independent-projects/arc/processor/src/main/java/io/quarkus/arc/processor/DecoratorGenerator.java index 1f60236883a6e..3f466b615784f 100644 --- a/independent-projects/arc/processor/src/main/java/io/quarkus/arc/processor/DecoratorGenerator.java +++ b/independent-projects/arc/processor/src/main/java/io/quarkus/arc/processor/DecoratorGenerator.java @@ -277,7 +277,7 @@ protected void createConstructor(ClassOutput classOutput, ClassCreator creator, ResultHandle delegateQualifiersHandle = constructor.newInstance(MethodDescriptor.ofConstructor(HashSet.class)); for (AnnotationInstance delegateQualifier : decorator.getDelegateQualifiers()) { // Create annotation literal first - ClassInfo delegateQualifierClass = decorator.getDeployment().getInterceptorBinding(delegateQualifier.name()); + ClassInfo delegateQualifierClass = decorator.getDeployment().getQualifier(delegateQualifier.name()); constructor.invokeInterfaceMethod(MethodDescriptors.SET_ADD, delegateQualifiersHandle, annotationLiterals.process(constructor, classOutput, delegateQualifierClass, delegateQualifier, Types.getPackageName(creator.getClassName()))); diff --git a/independent-projects/arc/tests/src/test/java/io/quarkus/arc/test/decorators/qualifiers/DelegateQualifiersTest.java b/independent-projects/arc/tests/src/test/java/io/quarkus/arc/test/decorators/qualifiers/DelegateQualifiersTest.java new file mode 100644 index 0000000000000..37fbc8b4a2606 --- /dev/null +++ b/independent-projects/arc/tests/src/test/java/io/quarkus/arc/test/decorators/qualifiers/DelegateQualifiersTest.java @@ -0,0 +1,72 @@ +package io.quarkus.arc.test.decorators.qualifiers; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +import io.quarkus.arc.Arc; +import io.quarkus.arc.test.ArcTestContainer; +import io.quarkus.arc.test.MyQualifier; +import javax.annotation.Priority; +import javax.decorator.Decorator; +import javax.decorator.Delegate; +import javax.enterprise.context.ApplicationScoped; +import javax.enterprise.context.Dependent; +import javax.enterprise.util.AnnotationLiteral; +import javax.inject.Inject; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.RegisterExtension; + +public class DelegateQualifiersTest { + + @RegisterExtension + public ArcTestContainer container = new ArcTestContainer(Converter.class, ToUpperCaseConverter.class, + TrimConverterDecorator.class, MyQualifier.class); + + @Test + public void testDecoration() { + @SuppressWarnings("serial") + ToUpperCaseConverter converter = Arc.container() + .instance(ToUpperCaseConverter.class, new AnnotationLiteral() { + }).get(); + assertEquals("HOLA!", converter.convert(" holA!")); + assertEquals(" HOLA!", converter.convertNoDelegation(" holA!")); + } + + interface Converter { + + T convert(T value); + + } + + @MyQualifier + @ApplicationScoped + static class ToUpperCaseConverter implements Converter { + + @Override + public String convert(String value) { + return value.toUpperCase(); + } + + public String convertNoDelegation(String value) { + return value.toUpperCase(); + } + + } + + @Dependent + @Priority(1) + @Decorator + static class TrimConverterDecorator implements Converter { + + @Inject + @MyQualifier + @Delegate + Converter delegate; + + @Override + public String convert(String value) { + return delegate.convert(value.trim()); + } + + } + +}