From 3020413e971867be7e8d036c4a025342b6d10dab Mon Sep 17 00:00:00 2001 From: Matej Novotny Date: Wed, 2 Mar 2022 10:43:46 +0100 Subject: [PATCH] Arc - mention that decorating built-in types is not supported; log a warning if we detect such case. --- docs/src/main/asciidoc/cdi-reference.adoc | 1 + .../io/quarkus/arc/processor/Decorators.java | 10 +++ .../DecoratorForBuiltInEventTypeTest.java | 72 +++++++++++++++++++ 3 files changed, 83 insertions(+) create mode 100644 independent-projects/arc/tests/src/test/java/io/quarkus/arc/test/decorators/validation/DecoratorForBuiltInEventTypeTest.java diff --git a/docs/src/main/asciidoc/cdi-reference.adoc b/docs/src/main/asciidoc/cdi-reference.adoc index 702d861df6ace..fb57163d3a5e1 100644 --- a/docs/src/main/asciidoc/cdi-reference.adoc +++ b/docs/src/main/asciidoc/cdi-reference.adoc @@ -214,6 +214,7 @@ public class CounterBean { * Passivation and passivating scopes are not supported * Interceptor methods on superclasses are not implemented yet * `@Interceptors` is not supported +* Decoration of built-in beans, such as `Event`, is not supported [[nonstandard_features]] == Non-standard Features diff --git a/independent-projects/arc/processor/src/main/java/io/quarkus/arc/processor/Decorators.java b/independent-projects/arc/processor/src/main/java/io/quarkus/arc/processor/Decorators.java index 46810ff215bca..92370dae42b4a 100644 --- a/independent-projects/arc/processor/src/main/java/io/quarkus/arc/processor/Decorators.java +++ b/independent-projects/arc/processor/src/main/java/io/quarkus/arc/processor/Decorators.java @@ -80,6 +80,16 @@ static DecoratorInfo createDecorator(ClassInfo decoratorClass, BeanDeployment be throw new DefinitionException("The delegate type " + delegateInjectionPoint.getRequiredType() + " does not implement the decorated type: " + decoratedType); } + for (BuiltinBean bean : BuiltinBean.values()) { + if (bean.equals(BuiltinBean.RESOURCE)) { + // do not take Resource into consideration + continue; + } + if (bean.hasRawTypeDotName(decoratedType.name())) { + throw new UnsupportedOperationException("Decorating built-in bean types is not supported! " + + "Decorator " + decoratorClass + " is attempting to decorate " + decoratedType.name()); + } + } } if (priority == null) { diff --git a/independent-projects/arc/tests/src/test/java/io/quarkus/arc/test/decorators/validation/DecoratorForBuiltInEventTypeTest.java b/independent-projects/arc/tests/src/test/java/io/quarkus/arc/test/decorators/validation/DecoratorForBuiltInEventTypeTest.java new file mode 100644 index 0000000000000..1658e8f866329 --- /dev/null +++ b/independent-projects/arc/tests/src/test/java/io/quarkus/arc/test/decorators/validation/DecoratorForBuiltInEventTypeTest.java @@ -0,0 +1,72 @@ +package io.quarkus.arc.test.decorators.validation; + +import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.junit.jupiter.api.Assertions.assertTrue; + +import io.quarkus.arc.Priority; +import io.quarkus.arc.test.ArcTestContainer; +import java.lang.annotation.Annotation; +import java.util.concurrent.CompletionStage; +import javax.decorator.Decorator; +import javax.decorator.Delegate; +import javax.enterprise.event.Event; +import javax.enterprise.event.NotificationOptions; +import javax.enterprise.util.TypeLiteral; +import javax.inject.Inject; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.RegisterExtension; + +public class DecoratorForBuiltInEventTypeTest { + + @RegisterExtension + public ArcTestContainer container = ArcTestContainer.builder() + .beanClasses(BadDecorator.class) + .shouldFail().build(); + + @Test + public void testFailure() { + assertNotNull(container.getFailure()); + assertTrue( + container.getFailure().getMessage().contains("Decorating built-in bean types is not supported!"), + container.getFailure().getMessage()); + } + + @Decorator + @Priority(1) + static class BadDecorator implements Event { + + @Delegate + @Inject + Event delegate; + + @Override + public void fire(T event) { + + } + + @Override + public Event select(Annotation... qualifiers) { + return null; + } + + @Override + public Event select(Class subtype, Annotation... qualifiers) { + return null; + } + + @Override + public Event select(TypeLiteral subtype, Annotation... qualifiers) { + return null; + } + + @Override + public CompletionStage fireAsync(U event, NotificationOptions options) { + return null; + } + + @Override + public CompletionStage fireAsync(U event) { + return null; + } + } +}