Skip to content

Commit

Permalink
Merge pull request #18226 from mkouba/issue-18200
Browse files Browse the repository at this point in the history
  • Loading branch information
gastaldi authored Jun 30, 2021
2 parents b6a1ccf + daad88d commit ada7316
Show file tree
Hide file tree
Showing 5 changed files with 72 additions and 6 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -116,12 +116,17 @@ FeatureBuildItem feature() {
}

@BuildStep
AdditionalBeanBuildItem quarkusApplication(CombinedIndexBuildItem combinedIndexBuildItem) {
AdditionalBeanBuildItem quarkusApplication(CombinedIndexBuildItem combinedIndex) {
List<String> quarkusApplications = new ArrayList<>();
for (ClassInfo quarkusApplication : combinedIndex.getIndex()
.getAllKnownImplementors(DotName.createSimple(QuarkusApplication.class.getName()))) {
if (quarkusApplication.classAnnotation(DotNames.DECORATOR) == null) {
quarkusApplications.add(quarkusApplication.name().toString());
}
}
return AdditionalBeanBuildItem.builder().setUnremovable()
.setDefaultScope(DotName.createSimple(ApplicationScoped.class.getName()))
.addBeanClasses(combinedIndexBuildItem.getIndex()
.getAllKnownImplementors(DotName.createSimple(QuarkusApplication.class.getName())).stream()
.map(s -> s.name().toString()).toArray(String[]::new))
.addBeanClasses(quarkusApplications)
.build();
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -773,8 +773,9 @@ private List<BeanInfo> findBeans(Collection<DotName> beanDefiningAnnotations, Li
continue;
}

if (annotationStore.hasAnnotation(beanClass, DotNames.INTERCEPTOR)) {
// Skip interceptors
if (annotationStore.hasAnnotation(beanClass, DotNames.INTERCEPTOR)
|| annotationStore.hasAnnotation(beanClass, DotNames.DECORATOR)) {
// Skip interceptors and decorators
continue;
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -49,6 +49,11 @@ static DecoratorInfo createDecorator(ClassInfo decoratorClass, BeanDeployment be
priority = annotation.value().asInt();
priorityDeclared = true;
}
ScopeInfo scopeAnnotation = beanDeployment.getScope(annotation.name());
if (scopeAnnotation != null && !BuiltinScope.DEPENDENT.is(scopeAnnotation)) {
throw new DefinitionException(
"A decorator must be @Dependent but " + decoratorClass + " declares " + scopeAnnotation.getDotName());
}
}

// The set includes all bean types which are Java interfaces, except for java.io.Serializable
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
import javax.decorator.Decorator;
import javax.decorator.Delegate;
import javax.enterprise.context.ApplicationScoped;
import javax.enterprise.context.Dependent;
import javax.inject.Inject;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.RegisterExtension;
Expand Down Expand Up @@ -45,6 +46,7 @@ public String convertNoDelegation(String value) {

}

@Dependent
@Priority(1)
@Decorator
static class TrimConverterDecorator implements Converter<String> {
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
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.test.ArcTestContainer;
import javax.annotation.Priority;
import javax.decorator.Decorator;
import javax.decorator.Delegate;
import javax.enterprise.context.ApplicationScoped;
import javax.inject.Inject;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.RegisterExtension;

public class NonDependentScopeTest {

@RegisterExtension
public ArcTestContainer container = ArcTestContainer.builder()
.beanClasses(Converter.class, DecoratorWithWrongScope.class).shouldFail().build();

@Test
public void testFailure() {
assertNotNull(container.getFailure());
assertTrue(
container.getFailure().getMessage()
.contains(
"A decorator must be @Dependent but io.quarkus.arc.test.decorators.validation.NonDependentScopeTest$DecoratorWithWrongScope declares javax.enterprise.context.ApplicationScoped"),
container.getFailure().getMessage());
}

interface Converter<T, U> {

T convert(T value);

}

@ApplicationScoped
@Priority(1)
@Decorator
static class DecoratorWithWrongScope implements Converter<String, String> {

@Inject
@Delegate
Converter<String, String> delegate;

@Override
public String convert(String value) {
return null;
}

}

}

0 comments on commit ada7316

Please sign in to comment.